@gnsx/three 0.184.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 (1182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/build/three.cjs +79695 -0
  4. package/build/three.core.js +59732 -0
  5. package/build/three.core.min.js +6 -0
  6. package/build/three.module.js +19552 -0
  7. package/build/three.module.min.js +6 -0
  8. package/build/three.tsl.js +654 -0
  9. package/build/three.tsl.min.js +6 -0
  10. package/build/three.webgpu.js +83969 -0
  11. package/build/three.webgpu.min.js +6 -0
  12. package/build/three.webgpu.nodes.js +83702 -0
  13. package/build/three.webgpu.nodes.min.js +6 -0
  14. package/examples/fonts/LICENSE +13 -0
  15. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  16. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  17. package/examples/fonts/README.md +11 -0
  18. package/examples/fonts/droid/NOTICE +190 -0
  19. package/examples/fonts/droid/README.txt +18 -0
  20. package/examples/fonts/droid/droid_sans_bold.typeface.json +1 -0
  21. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +1 -0
  22. package/examples/fonts/droid/droid_sans_regular.typeface.json +1 -0
  23. package/examples/fonts/droid/droid_serif_bold.typeface.json +1 -0
  24. package/examples/fonts/droid/droid_serif_regular.typeface.json +1 -0
  25. package/examples/fonts/gentilis_bold.typeface.json +1 -0
  26. package/examples/fonts/gentilis_regular.typeface.json +1 -0
  27. package/examples/fonts/helvetiker_bold.typeface.json +1 -0
  28. package/examples/fonts/helvetiker_regular.typeface.json +1 -0
  29. package/examples/fonts/optimer_bold.typeface.json +1 -0
  30. package/examples/fonts/optimer_regular.typeface.json +1 -0
  31. package/examples/fonts/ttf/README.md +9 -0
  32. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  33. package/examples/jsm/Addons.js +293 -0
  34. package/examples/jsm/animation/AnimationClipCreator.js +168 -0
  35. package/examples/jsm/animation/CCDIKSolver.js +595 -0
  36. package/examples/jsm/capabilities/WebGL.js +113 -0
  37. package/examples/jsm/capabilities/WebGPU.js +59 -0
  38. package/examples/jsm/controls/ArcballControls.js +3539 -0
  39. package/examples/jsm/controls/DragControls.js +452 -0
  40. package/examples/jsm/controls/FirstPersonControls.js +451 -0
  41. package/examples/jsm/controls/FlyControls.js +384 -0
  42. package/examples/jsm/controls/MapControls.js +116 -0
  43. package/examples/jsm/controls/OrbitControls.js +1963 -0
  44. package/examples/jsm/controls/PointerLockControls.js +264 -0
  45. package/examples/jsm/controls/TrackballControls.js +1001 -0
  46. package/examples/jsm/controls/TransformControls.js +1950 -0
  47. package/examples/jsm/csm/CSM.js +598 -0
  48. package/examples/jsm/csm/CSMFrustum.js +209 -0
  49. package/examples/jsm/csm/CSMHelper.js +243 -0
  50. package/examples/jsm/csm/CSMShader.js +307 -0
  51. package/examples/jsm/csm/CSMShadowNode.js +603 -0
  52. package/examples/jsm/curves/CurveExtras.js +694 -0
  53. package/examples/jsm/curves/NURBSCurve.js +155 -0
  54. package/examples/jsm/curves/NURBSSurface.js +98 -0
  55. package/examples/jsm/curves/NURBSUtils.js +532 -0
  56. package/examples/jsm/curves/NURBSVolume.js +82 -0
  57. package/examples/jsm/effects/AnaglyphEffect.js +274 -0
  58. package/examples/jsm/effects/AsciiEffect.js +310 -0
  59. package/examples/jsm/effects/OutlineEffect.js +489 -0
  60. package/examples/jsm/effects/ParallaxBarrierEffect.js +155 -0
  61. package/examples/jsm/effects/StereoEffect.js +91 -0
  62. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  63. package/examples/jsm/environments/DebugEnvironment.js +102 -0
  64. package/examples/jsm/environments/RoomEnvironment.js +185 -0
  65. package/examples/jsm/exporters/DRACOExporter.js +311 -0
  66. package/examples/jsm/exporters/EXRExporter.js +618 -0
  67. package/examples/jsm/exporters/GLTFExporter.js +3738 -0
  68. package/examples/jsm/exporters/KTX2Exporter.js +347 -0
  69. package/examples/jsm/exporters/OBJExporter.js +308 -0
  70. package/examples/jsm/exporters/PLYExporter.js +562 -0
  71. package/examples/jsm/exporters/STLExporter.js +221 -0
  72. package/examples/jsm/exporters/USDZExporter.js +1254 -0
  73. package/examples/jsm/geometries/BoxLineGeometry.js +92 -0
  74. package/examples/jsm/geometries/ConvexGeometry.js +72 -0
  75. package/examples/jsm/geometries/DecalGeometry.js +420 -0
  76. package/examples/jsm/geometries/ParametricFunctions.js +100 -0
  77. package/examples/jsm/geometries/ParametricGeometry.js +172 -0
  78. package/examples/jsm/geometries/RoundedBoxGeometry.js +216 -0
  79. package/examples/jsm/geometries/TeapotGeometry.js +689 -0
  80. package/examples/jsm/geometries/TextGeometry.js +102 -0
  81. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  82. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  83. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  84. package/examples/jsm/helpers/LightProbeHelper.js +165 -0
  85. package/examples/jsm/helpers/LightProbeHelperGPU.js +102 -0
  86. package/examples/jsm/helpers/OctreeHelper.js +109 -0
  87. package/examples/jsm/helpers/PositionalAudioHelper.js +169 -0
  88. package/examples/jsm/helpers/RapierHelper.js +59 -0
  89. package/examples/jsm/helpers/RectAreaLightHelper.js +118 -0
  90. package/examples/jsm/helpers/TextureHelper.js +265 -0
  91. package/examples/jsm/helpers/TextureHelperGPU.js +214 -0
  92. package/examples/jsm/helpers/VertexNormalsHelper.js +155 -0
  93. package/examples/jsm/helpers/VertexTangentsHelper.js +133 -0
  94. package/examples/jsm/helpers/ViewHelper.js +519 -0
  95. package/examples/jsm/inspector/Extension.js +13 -0
  96. package/examples/jsm/inspector/Inspector.js +542 -0
  97. package/examples/jsm/inspector/RendererInspector.js +425 -0
  98. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  99. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  100. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  101. package/examples/jsm/inspector/tabs/Console.js +238 -0
  102. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  103. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  104. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  105. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  106. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  107. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  108. package/examples/jsm/inspector/ui/Graph.js +95 -0
  109. package/examples/jsm/inspector/ui/Item.js +170 -0
  110. package/examples/jsm/inspector/ui/List.js +75 -0
  111. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  112. package/examples/jsm/inspector/ui/Style.js +1667 -0
  113. package/examples/jsm/inspector/ui/Tab.js +265 -0
  114. package/examples/jsm/inspector/ui/Values.js +476 -0
  115. package/examples/jsm/inspector/ui/utils.js +69 -0
  116. package/examples/jsm/interaction/InteractionManager.js +226 -0
  117. package/examples/jsm/interactive/HTMLMesh.js +601 -0
  118. package/examples/jsm/interactive/InteractiveGroup.js +224 -0
  119. package/examples/jsm/interactive/SelectionBox.js +324 -0
  120. package/examples/jsm/interactive/SelectionHelper.js +150 -0
  121. package/examples/jsm/libs/ammo.wasm.js +822 -0
  122. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  123. package/examples/jsm/libs/basis/README.md +46 -0
  124. package/examples/jsm/libs/basis/basis_transcoder.js +19 -0
  125. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  126. package/examples/jsm/libs/chevrotain.module.min.js +141 -0
  127. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  128. package/examples/jsm/libs/draco/README.md +32 -0
  129. package/examples/jsm/libs/draco/draco_decoder.js +34 -0
  130. package/examples/jsm/libs/draco/draco_decoder.wasm +0 -0
  131. package/examples/jsm/libs/draco/draco_encoder.js +33 -0
  132. package/examples/jsm/libs/draco/draco_wasm_wrapper.js +117 -0
  133. package/examples/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  134. package/examples/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  135. package/examples/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  136. package/examples/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  137. package/examples/jsm/libs/ecsy.module.js +1792 -0
  138. package/examples/jsm/libs/fflate.module.js +2672 -0
  139. package/examples/jsm/libs/ktx-parse.module.js +1 -0
  140. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  141. package/examples/jsm/libs/lottie_canvas.module.js +14849 -0
  142. package/examples/jsm/libs/meshopt_decoder.module.js +196 -0
  143. package/examples/jsm/libs/mikktspace.module.js +128 -0
  144. package/examples/jsm/libs/motion-controllers.module.js +397 -0
  145. package/examples/jsm/libs/opentype.module.js +14506 -0
  146. package/examples/jsm/libs/potpack.module.js +125 -0
  147. package/examples/jsm/libs/rhino3dm/rhino3dm.js +21 -0
  148. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +16 -0
  149. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  150. package/examples/jsm/libs/stats.module.js +167 -0
  151. package/examples/jsm/libs/surfaceNet.js +201 -0
  152. package/examples/jsm/libs/tween.module.js +876 -0
  153. package/examples/jsm/libs/utif.module.js +1665 -0
  154. package/examples/jsm/libs/zstddec.module.js +1 -0
  155. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  156. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  157. package/examples/jsm/lighting/TiledLighting.js +42 -0
  158. package/examples/jsm/lights/LightProbeGenerator.js +337 -0
  159. package/examples/jsm/lights/RectAreaLightTexturesLib.js +127 -0
  160. package/examples/jsm/lights/RectAreaLightUniformsLib.js +40 -0
  161. package/examples/jsm/lines/Line2.js +56 -0
  162. package/examples/jsm/lines/LineGeometry.js +157 -0
  163. package/examples/jsm/lines/LineMaterial.js +703 -0
  164. package/examples/jsm/lines/LineSegments2.js +426 -0
  165. package/examples/jsm/lines/LineSegmentsGeometry.js +298 -0
  166. package/examples/jsm/lines/Wireframe.js +108 -0
  167. package/examples/jsm/lines/WireframeGeometry2.js +49 -0
  168. package/examples/jsm/lines/webgpu/Line2.js +46 -0
  169. package/examples/jsm/lines/webgpu/LineSegments2.js +411 -0
  170. package/examples/jsm/lines/webgpu/Wireframe.js +86 -0
  171. package/examples/jsm/loaders/3DMLoader.js +1836 -0
  172. package/examples/jsm/loaders/3MFLoader.js +1621 -0
  173. package/examples/jsm/loaders/AMFLoader.js +541 -0
  174. package/examples/jsm/loaders/BVHLoader.js +484 -0
  175. package/examples/jsm/loaders/ColladaLoader.js +153 -0
  176. package/examples/jsm/loaders/DDSLoader.js +385 -0
  177. package/examples/jsm/loaders/DRACOLoader.js +739 -0
  178. package/examples/jsm/loaders/EXRLoader.js +3423 -0
  179. package/examples/jsm/loaders/FBXLoader.js +4580 -0
  180. package/examples/jsm/loaders/FontLoader.js +260 -0
  181. package/examples/jsm/loaders/GCodeLoader.js +318 -0
  182. package/examples/jsm/loaders/GLTFLoader.js +4860 -0
  183. package/examples/jsm/loaders/HDRCubeTextureLoader.js +164 -0
  184. package/examples/jsm/loaders/HDRLoader.js +485 -0
  185. package/examples/jsm/loaders/IESLoader.js +379 -0
  186. package/examples/jsm/loaders/KMZLoader.js +163 -0
  187. package/examples/jsm/loaders/KTX2Loader.js +1257 -0
  188. package/examples/jsm/loaders/KTXLoader.js +197 -0
  189. package/examples/jsm/loaders/LDrawLoader.js +2510 -0
  190. package/examples/jsm/loaders/LUT3dlLoader.js +205 -0
  191. package/examples/jsm/loaders/LUTCubeLoader.js +190 -0
  192. package/examples/jsm/loaders/LUTImageLoader.js +190 -0
  193. package/examples/jsm/loaders/LWOLoader.js +1047 -0
  194. package/examples/jsm/loaders/LottieLoader.js +130 -0
  195. package/examples/jsm/loaders/MD2Loader.js +435 -0
  196. package/examples/jsm/loaders/MDDLoader.js +147 -0
  197. package/examples/jsm/loaders/MTLLoader.js +593 -0
  198. package/examples/jsm/loaders/MaterialXLoader.js +1104 -0
  199. package/examples/jsm/loaders/NRRDLoader.js +718 -0
  200. package/examples/jsm/loaders/OBJLoader.js +955 -0
  201. package/examples/jsm/loaders/PCDLoader.js +620 -0
  202. package/examples/jsm/loaders/PDBLoader.js +272 -0
  203. package/examples/jsm/loaders/PLYLoader.js +805 -0
  204. package/examples/jsm/loaders/PVRLoader.js +270 -0
  205. package/examples/jsm/loaders/RGBELoader.js +18 -0
  206. package/examples/jsm/loaders/STLLoader.js +421 -0
  207. package/examples/jsm/loaders/SVGLoader.js +3267 -0
  208. package/examples/jsm/loaders/TDSLoader.js +1142 -0
  209. package/examples/jsm/loaders/TGALoader.js +538 -0
  210. package/examples/jsm/loaders/TIFFLoader.js +59 -0
  211. package/examples/jsm/loaders/TTFLoader.js +261 -0
  212. package/examples/jsm/loaders/USDLoader.js +279 -0
  213. package/examples/jsm/loaders/USDZLoader.js +16 -0
  214. package/examples/jsm/loaders/UltraHDRLoader.js +755 -0
  215. package/examples/jsm/loaders/VOXLoader.js +919 -0
  216. package/examples/jsm/loaders/VRMLLoader.js +3646 -0
  217. package/examples/jsm/loaders/VTKLoader.js +1293 -0
  218. package/examples/jsm/loaders/XYZLoader.js +143 -0
  219. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  220. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  221. package/examples/jsm/loaders/lwo/IFFParser.js +1217 -0
  222. package/examples/jsm/loaders/lwo/LWO2Parser.js +414 -0
  223. package/examples/jsm/loaders/lwo/LWO3Parser.js +373 -0
  224. package/examples/jsm/loaders/usd/USDAParser.js +828 -0
  225. package/examples/jsm/loaders/usd/USDCParser.js +1878 -0
  226. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  227. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +183 -0
  228. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +154 -0
  229. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  230. package/examples/jsm/math/Capsule.js +159 -0
  231. package/examples/jsm/math/ColorConverter.js +58 -0
  232. package/examples/jsm/math/ColorSpaces.js +147 -0
  233. package/examples/jsm/math/ConvexHull.js +1695 -0
  234. package/examples/jsm/math/ImprovedNoise.js +88 -0
  235. package/examples/jsm/math/Lut.js +317 -0
  236. package/examples/jsm/math/MeshSurfaceSampler.js +315 -0
  237. package/examples/jsm/math/OBB.js +535 -0
  238. package/examples/jsm/math/Octree.js +822 -0
  239. package/examples/jsm/math/SimplexNoise.js +470 -0
  240. package/examples/jsm/misc/ConvexObjectBreaker.js +539 -0
  241. package/examples/jsm/misc/GPUComputationRenderer.js +508 -0
  242. package/examples/jsm/misc/Gyroscope.js +78 -0
  243. package/examples/jsm/misc/MD2Character.js +391 -0
  244. package/examples/jsm/misc/MD2CharacterComplex.js +740 -0
  245. package/examples/jsm/misc/MorphAnimMesh.js +119 -0
  246. package/examples/jsm/misc/MorphBlendMesh.js +425 -0
  247. package/examples/jsm/misc/ProgressiveLightMap.js +370 -0
  248. package/examples/jsm/misc/ProgressiveLightMapGPU.js +322 -0
  249. package/examples/jsm/misc/RollerCoaster.js +661 -0
  250. package/examples/jsm/misc/TubePainter.js +599 -0
  251. package/examples/jsm/misc/Volume.js +520 -0
  252. package/examples/jsm/misc/VolumeSlice.js +275 -0
  253. package/examples/jsm/modifiers/CurveModifier.js +374 -0
  254. package/examples/jsm/modifiers/CurveModifierGPU.js +256 -0
  255. package/examples/jsm/modifiers/EdgeSplitModifier.js +299 -0
  256. package/examples/jsm/modifiers/SimplifyModifier.js +632 -0
  257. package/examples/jsm/modifiers/TessellateModifier.js +340 -0
  258. package/examples/jsm/objects/GroundedSkybox.js +69 -0
  259. package/examples/jsm/objects/Lensflare.js +489 -0
  260. package/examples/jsm/objects/LensflareMesh.js +376 -0
  261. package/examples/jsm/objects/MarchingCubes.js +1261 -0
  262. package/examples/jsm/objects/Reflector.js +386 -0
  263. package/examples/jsm/objects/ReflectorForSSRPass.js +393 -0
  264. package/examples/jsm/objects/Refractor.js +389 -0
  265. package/examples/jsm/objects/ShadowMesh.js +130 -0
  266. package/examples/jsm/objects/Sky.js +321 -0
  267. package/examples/jsm/objects/SkyMesh.js +377 -0
  268. package/examples/jsm/objects/Water.js +374 -0
  269. package/examples/jsm/objects/Water2.js +403 -0
  270. package/examples/jsm/objects/Water2Mesh.js +199 -0
  271. package/examples/jsm/objects/WaterMesh.js +194 -0
  272. package/examples/jsm/offscreen/jank.js +45 -0
  273. package/examples/jsm/offscreen/offscreen.js +8 -0
  274. package/examples/jsm/offscreen/scene.js +86 -0
  275. package/examples/jsm/physics/AmmoPhysics.js +359 -0
  276. package/examples/jsm/physics/JoltPhysics.js +334 -0
  277. package/examples/jsm/physics/RapierPhysics.js +436 -0
  278. package/examples/jsm/postprocessing/AfterimagePass.js +185 -0
  279. package/examples/jsm/postprocessing/BloomPass.js +274 -0
  280. package/examples/jsm/postprocessing/BokehPass.js +218 -0
  281. package/examples/jsm/postprocessing/ClearPass.js +97 -0
  282. package/examples/jsm/postprocessing/CubeTexturePass.js +146 -0
  283. package/examples/jsm/postprocessing/DotScreenPass.js +114 -0
  284. package/examples/jsm/postprocessing/EffectComposer.js +365 -0
  285. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  286. package/examples/jsm/postprocessing/FilmPass.js +113 -0
  287. package/examples/jsm/postprocessing/GTAOPass.js +727 -0
  288. package/examples/jsm/postprocessing/GlitchPass.js +177 -0
  289. package/examples/jsm/postprocessing/HalftonePass.js +134 -0
  290. package/examples/jsm/postprocessing/LUTPass.js +138 -0
  291. package/examples/jsm/postprocessing/MaskPass.js +195 -0
  292. package/examples/jsm/postprocessing/OutlinePass.js +776 -0
  293. package/examples/jsm/postprocessing/OutputPass.js +148 -0
  294. package/examples/jsm/postprocessing/Pass.js +191 -0
  295. package/examples/jsm/postprocessing/RenderPass.js +193 -0
  296. package/examples/jsm/postprocessing/RenderPixelatedPass.js +314 -0
  297. package/examples/jsm/postprocessing/RenderTransitionPass.js +267 -0
  298. package/examples/jsm/postprocessing/SAOPass.js +407 -0
  299. package/examples/jsm/postprocessing/SMAAPass.js +230 -0
  300. package/examples/jsm/postprocessing/SSAARenderPass.js +313 -0
  301. package/examples/jsm/postprocessing/SSAOPass.js +527 -0
  302. package/examples/jsm/postprocessing/SSRPass.js +856 -0
  303. package/examples/jsm/postprocessing/SavePass.js +132 -0
  304. package/examples/jsm/postprocessing/ShaderPass.js +135 -0
  305. package/examples/jsm/postprocessing/TAARenderPass.js +243 -0
  306. package/examples/jsm/postprocessing/TexturePass.js +131 -0
  307. package/examples/jsm/postprocessing/UnrealBloomPass.js +524 -0
  308. package/examples/jsm/renderers/CSS2DRenderer.js +328 -0
  309. package/examples/jsm/renderers/CSS3DRenderer.js +454 -0
  310. package/examples/jsm/renderers/Projector.js +1154 -0
  311. package/examples/jsm/renderers/SVGRenderer.js +799 -0
  312. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +96 -0
  313. package/examples/jsm/shaders/AfterimageShader.js +63 -0
  314. package/examples/jsm/shaders/BasicShader.js +36 -0
  315. package/examples/jsm/shaders/BleachBypassShader.js +68 -0
  316. package/examples/jsm/shaders/BlendShader.js +56 -0
  317. package/examples/jsm/shaders/BokehShader.js +151 -0
  318. package/examples/jsm/shaders/BokehShader2.js +404 -0
  319. package/examples/jsm/shaders/BrightnessContrastShader.js +62 -0
  320. package/examples/jsm/shaders/ColorCorrectionShader.js +59 -0
  321. package/examples/jsm/shaders/ColorifyShader.js +57 -0
  322. package/examples/jsm/shaders/ConvolutionShader.js +74 -0
  323. package/examples/jsm/shaders/CopyShader.js +52 -0
  324. package/examples/jsm/shaders/DOFMipMapShader.js +63 -0
  325. package/examples/jsm/shaders/DepthLimitedBlurShader.js +180 -0
  326. package/examples/jsm/shaders/DigitalGlitch.js +104 -0
  327. package/examples/jsm/shaders/DotScreenShader.js +75 -0
  328. package/examples/jsm/shaders/ExposureShader.js +51 -0
  329. package/examples/jsm/shaders/FXAAShader.js +298 -0
  330. package/examples/jsm/shaders/FilmShader.js +72 -0
  331. package/examples/jsm/shaders/FocusShader.js +94 -0
  332. package/examples/jsm/shaders/FreiChenShader.js +103 -0
  333. package/examples/jsm/shaders/GTAOShader.js +434 -0
  334. package/examples/jsm/shaders/GammaCorrectionShader.js +52 -0
  335. package/examples/jsm/shaders/HalftoneShader.js +332 -0
  336. package/examples/jsm/shaders/HorizontalBlurShader.js +68 -0
  337. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +70 -0
  338. package/examples/jsm/shaders/HueSaturationShader.js +74 -0
  339. package/examples/jsm/shaders/KaleidoShader.js +65 -0
  340. package/examples/jsm/shaders/LuminosityHighPassShader.js +68 -0
  341. package/examples/jsm/shaders/LuminosityShader.js +54 -0
  342. package/examples/jsm/shaders/MirrorShader.js +62 -0
  343. package/examples/jsm/shaders/NormalMapShader.js +60 -0
  344. package/examples/jsm/shaders/OutputShader.js +103 -0
  345. package/examples/jsm/shaders/PoissonDenoiseShader.js +239 -0
  346. package/examples/jsm/shaders/RGBShiftShader.js +61 -0
  347. package/examples/jsm/shaders/SAOShader.js +201 -0
  348. package/examples/jsm/shaders/SMAAShader.js +489 -0
  349. package/examples/jsm/shaders/SSAOShader.js +331 -0
  350. package/examples/jsm/shaders/SSRShader.js +396 -0
  351. package/examples/jsm/shaders/SepiaShader.js +57 -0
  352. package/examples/jsm/shaders/SobelOperatorShader.js +98 -0
  353. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +95 -0
  354. package/examples/jsm/shaders/TechnicolorShader.js +51 -0
  355. package/examples/jsm/shaders/ToonShader.js +349 -0
  356. package/examples/jsm/shaders/TriangleBlurShader.js +79 -0
  357. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +60 -0
  358. package/examples/jsm/shaders/VelocityShader.js +137 -0
  359. package/examples/jsm/shaders/VerticalBlurShader.js +66 -0
  360. package/examples/jsm/shaders/VerticalTiltShiftShader.js +70 -0
  361. package/examples/jsm/shaders/VignetteShader.js +56 -0
  362. package/examples/jsm/shaders/VolumeShader.js +298 -0
  363. package/examples/jsm/shaders/WaterRefractionShader.js +106 -0
  364. package/examples/jsm/textures/FlakesTexture.js +54 -0
  365. package/examples/jsm/transpiler/AST.js +675 -0
  366. package/examples/jsm/transpiler/GLSLDecoder.js +1228 -0
  367. package/examples/jsm/transpiler/Linker.js +327 -0
  368. package/examples/jsm/transpiler/ShaderToyDecoder.js +51 -0
  369. package/examples/jsm/transpiler/TSLEncoder.js +983 -0
  370. package/examples/jsm/transpiler/Transpiler.js +67 -0
  371. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  372. package/examples/jsm/transpiler/WGSLEncoder.js +839 -0
  373. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  374. package/examples/jsm/tsl/display/AfterImageNode.js +254 -0
  375. package/examples/jsm/tsl/display/AnaglyphPassNode.js +549 -0
  376. package/examples/jsm/tsl/display/AnamorphicNode.js +293 -0
  377. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  378. package/examples/jsm/tsl/display/BleachBypass.js +33 -0
  379. package/examples/jsm/tsl/display/BloomNode.js +534 -0
  380. package/examples/jsm/tsl/display/CRT.js +150 -0
  381. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +174 -0
  382. package/examples/jsm/tsl/display/DenoiseNode.js +334 -0
  383. package/examples/jsm/tsl/display/DepthOfFieldNode.js +554 -0
  384. package/examples/jsm/tsl/display/DotScreenNode.js +104 -0
  385. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  386. package/examples/jsm/tsl/display/FXAANode.js +365 -0
  387. package/examples/jsm/tsl/display/FilmNode.js +101 -0
  388. package/examples/jsm/tsl/display/GTAONode.js +572 -0
  389. package/examples/jsm/tsl/display/GaussianBlurNode.js +399 -0
  390. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  391. package/examples/jsm/tsl/display/LensflareNode.js +279 -0
  392. package/examples/jsm/tsl/display/Lut3DNode.js +109 -0
  393. package/examples/jsm/tsl/display/MotionBlur.js +33 -0
  394. package/examples/jsm/tsl/display/OutlineNode.js +812 -0
  395. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +89 -0
  396. package/examples/jsm/tsl/display/PixelationPassNode.js +335 -0
  397. package/examples/jsm/tsl/display/RGBShiftNode.js +96 -0
  398. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  399. package/examples/jsm/tsl/display/SMAANode.js +768 -0
  400. package/examples/jsm/tsl/display/SSAAPassNode.js +358 -0
  401. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  402. package/examples/jsm/tsl/display/SSRNode.js +656 -0
  403. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  404. package/examples/jsm/tsl/display/Sepia.js +24 -0
  405. package/examples/jsm/tsl/display/Shape.js +29 -0
  406. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  407. package/examples/jsm/tsl/display/SobelOperatorNode.js +168 -0
  408. package/examples/jsm/tsl/display/StereoCompositePassNode.js +192 -0
  409. package/examples/jsm/tsl/display/StereoPassNode.js +119 -0
  410. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  411. package/examples/jsm/tsl/display/TRAANode.js +767 -0
  412. package/examples/jsm/tsl/display/TransitionNode.js +141 -0
  413. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  414. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  415. package/examples/jsm/tsl/display/hashBlur.js +54 -0
  416. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  417. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  418. package/examples/jsm/tsl/lighting/TiledLightsNode.js +442 -0
  419. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  420. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  421. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  422. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  423. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  424. package/examples/jsm/tsl/math/Bayer.js +84 -0
  425. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  426. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  427. package/examples/jsm/tsl/utils/Raymarching.js +70 -0
  428. package/examples/jsm/utils/BufferGeometryUtils.js +1434 -0
  429. package/examples/jsm/utils/CameraUtils.js +82 -0
  430. package/examples/jsm/utils/ColorUtils.js +76 -0
  431. package/examples/jsm/utils/GeometryCompressionUtils.js +547 -0
  432. package/examples/jsm/utils/GeometryUtils.js +226 -0
  433. package/examples/jsm/utils/LDrawUtils.js +211 -0
  434. package/examples/jsm/utils/SceneOptimizer.js +458 -0
  435. package/examples/jsm/utils/SceneUtils.js +363 -0
  436. package/examples/jsm/utils/ShadowMapViewer.js +244 -0
  437. package/examples/jsm/utils/ShadowMapViewerGPU.js +233 -0
  438. package/examples/jsm/utils/SkeletonUtils.js +496 -0
  439. package/examples/jsm/utils/SortUtils.js +175 -0
  440. package/examples/jsm/utils/UVsDebug.js +173 -0
  441. package/examples/jsm/utils/WebGLTextureUtils.js +115 -0
  442. package/examples/jsm/utils/WebGPUTextureUtils.js +81 -0
  443. package/examples/jsm/utils/WorkerPool.js +167 -0
  444. package/examples/jsm/webxr/ARButton.js +251 -0
  445. package/examples/jsm/webxr/OculusHandModel.js +194 -0
  446. package/examples/jsm/webxr/OculusHandPointerModel.js +539 -0
  447. package/examples/jsm/webxr/Text2D.js +52 -0
  448. package/examples/jsm/webxr/VRButton.js +264 -0
  449. package/examples/jsm/webxr/XRButton.js +246 -0
  450. package/examples/jsm/webxr/XRControllerModelFactory.js +403 -0
  451. package/examples/jsm/webxr/XREstimatedLight.js +254 -0
  452. package/examples/jsm/webxr/XRHandMeshModel.js +177 -0
  453. package/examples/jsm/webxr/XRHandModelFactory.js +198 -0
  454. package/examples/jsm/webxr/XRHandPrimitiveModel.js +147 -0
  455. package/examples/jsm/webxr/XRPlanes.js +118 -0
  456. package/package.json +123 -0
  457. package/src/Three.Core.js +187 -0
  458. package/src/Three.Legacy.js +0 -0
  459. package/src/Three.TSL.js +647 -0
  460. package/src/Three.WebGPU.Nodes.js +31 -0
  461. package/src/Three.WebGPU.js +37 -0
  462. package/src/Three.js +10 -0
  463. package/src/animation/AnimationAction.js +942 -0
  464. package/src/animation/AnimationClip.js +628 -0
  465. package/src/animation/AnimationMixer.js +860 -0
  466. package/src/animation/AnimationObjectGroup.js +411 -0
  467. package/src/animation/AnimationUtils.js +495 -0
  468. package/src/animation/KeyframeTrack.js +636 -0
  469. package/src/animation/PropertyBinding.js +794 -0
  470. package/src/animation/PropertyMixer.js +385 -0
  471. package/src/animation/tracks/BooleanKeyframeTrack.js +55 -0
  472. package/src/animation/tracks/ColorKeyframeTrack.js +36 -0
  473. package/src/animation/tracks/NumberKeyframeTrack.js +36 -0
  474. package/src/animation/tracks/QuaternionKeyframeTrack.js +51 -0
  475. package/src/animation/tracks/StringKeyframeTrack.js +55 -0
  476. package/src/animation/tracks/VectorKeyframeTrack.js +36 -0
  477. package/src/audio/Audio.js +778 -0
  478. package/src/audio/AudioAnalyser.js +97 -0
  479. package/src/audio/AudioContext.js +40 -0
  480. package/src/audio/AudioListener.js +218 -0
  481. package/src/audio/PositionalAudio.js +253 -0
  482. package/src/cameras/ArrayCamera.js +54 -0
  483. package/src/cameras/Camera.js +160 -0
  484. package/src/cameras/CubeCamera.js +259 -0
  485. package/src/cameras/OrthographicCamera.js +245 -0
  486. package/src/cameras/PerspectiveCamera.js +407 -0
  487. package/src/cameras/StereoCamera.js +146 -0
  488. package/src/constants.js +1760 -0
  489. package/src/core/BufferAttribute.js +1056 -0
  490. package/src/core/BufferGeometry.js +1458 -0
  491. package/src/core/Clock.js +135 -0
  492. package/src/core/EventDispatcher.js +131 -0
  493. package/src/core/GLBufferAttribute.js +171 -0
  494. package/src/core/InstancedBufferAttribute.js +68 -0
  495. package/src/core/InstancedBufferGeometry.js +60 -0
  496. package/src/core/InstancedInterleavedBuffer.js +74 -0
  497. package/src/core/InterleavedBuffer.js +291 -0
  498. package/src/core/InterleavedBufferAttribute.js +549 -0
  499. package/src/core/Layers.js +121 -0
  500. package/src/core/Object3D.js +1667 -0
  501. package/src/core/Raycaster.js +262 -0
  502. package/src/core/RenderTarget.js +392 -0
  503. package/src/core/RenderTarget3D.js +48 -0
  504. package/src/core/Timer.js +184 -0
  505. package/src/core/Uniform.js +46 -0
  506. package/src/core/UniformsGroup.js +180 -0
  507. package/src/extras/Controls.js +120 -0
  508. package/src/extras/DataUtils.js +217 -0
  509. package/src/extras/Earcut.js +28 -0
  510. package/src/extras/ImageUtils.js +137 -0
  511. package/src/extras/PMREMGenerator.js +1167 -0
  512. package/src/extras/ShapeUtils.js +114 -0
  513. package/src/extras/TextureUtils.js +297 -0
  514. package/src/extras/core/Curve.js +517 -0
  515. package/src/extras/core/CurvePath.js +296 -0
  516. package/src/extras/core/Interpolations.js +111 -0
  517. package/src/extras/core/Path.js +329 -0
  518. package/src/extras/core/Shape.js +165 -0
  519. package/src/extras/core/ShapePath.js +367 -0
  520. package/src/extras/curves/ArcCurve.js +39 -0
  521. package/src/extras/curves/CatmullRomCurve3.js +327 -0
  522. package/src/extras/curves/CubicBezierCurve.js +145 -0
  523. package/src/extras/curves/CubicBezierCurve3.js +129 -0
  524. package/src/extras/curves/Curves.js +10 -0
  525. package/src/extras/curves/EllipseCurve.js +258 -0
  526. package/src/extras/curves/LineCurve.js +128 -0
  527. package/src/extras/curves/LineCurve3.js +128 -0
  528. package/src/extras/curves/QuadraticBezierCurve.js +133 -0
  529. package/src/extras/curves/QuadraticBezierCurve3.js +118 -0
  530. package/src/extras/curves/SplineCurve.js +145 -0
  531. package/src/extras/lib/earcut.js +685 -0
  532. package/src/geometries/BoxGeometry.js +219 -0
  533. package/src/geometries/CapsuleGeometry.js +218 -0
  534. package/src/geometries/CircleGeometry.js +142 -0
  535. package/src/geometries/ConeGeometry.js +70 -0
  536. package/src/geometries/CylinderGeometry.js +333 -0
  537. package/src/geometries/DodecahedronGeometry.js +99 -0
  538. package/src/geometries/EdgesGeometry.js +180 -0
  539. package/src/geometries/ExtrudeGeometry.js +910 -0
  540. package/src/geometries/Geometries.js +21 -0
  541. package/src/geometries/IcosahedronGeometry.js +75 -0
  542. package/src/geometries/LatheGeometry.js +230 -0
  543. package/src/geometries/OctahedronGeometry.js +70 -0
  544. package/src/geometries/PlaneGeometry.js +133 -0
  545. package/src/geometries/PolyhedronGeometry.js +348 -0
  546. package/src/geometries/RingGeometry.js +165 -0
  547. package/src/geometries/ShapeGeometry.js +233 -0
  548. package/src/geometries/SphereGeometry.js +175 -0
  549. package/src/geometries/TetrahedronGeometry.js +67 -0
  550. package/src/geometries/TorusGeometry.js +161 -0
  551. package/src/geometries/TorusKnotGeometry.js +206 -0
  552. package/src/geometries/TubeGeometry.js +253 -0
  553. package/src/geometries/WireframeGeometry.js +179 -0
  554. package/src/helpers/ArrowHelper.js +171 -0
  555. package/src/helpers/AxesHelper.js +96 -0
  556. package/src/helpers/Box3Helper.js +83 -0
  557. package/src/helpers/BoxHelper.js +149 -0
  558. package/src/helpers/CameraHelper.js +345 -0
  559. package/src/helpers/DirectionalLightHelper.js +148 -0
  560. package/src/helpers/GridHelper.js +82 -0
  561. package/src/helpers/HemisphereLightHelper.js +130 -0
  562. package/src/helpers/PlaneHelper.js +96 -0
  563. package/src/helpers/PointLightHelper.js +111 -0
  564. package/src/helpers/PolarGridHelper.js +126 -0
  565. package/src/helpers/SkeletonHelper.js +194 -0
  566. package/src/helpers/SpotLightHelper.js +154 -0
  567. package/src/lights/AmbientLight.js +42 -0
  568. package/src/lights/DirectionalLight.js +113 -0
  569. package/src/lights/DirectionalLightShadow.js +31 -0
  570. package/src/lights/HemisphereLight.js +76 -0
  571. package/src/lights/Light.js +85 -0
  572. package/src/lights/LightProbe.js +75 -0
  573. package/src/lights/LightShadow.js +347 -0
  574. package/src/lights/PointLight.js +131 -0
  575. package/src/lights/PointLightShadow.js +31 -0
  576. package/src/lights/RectAreaLight.js +115 -0
  577. package/src/lights/SpotLight.js +194 -0
  578. package/src/lights/SpotLightShadow.js +80 -0
  579. package/src/lights/webgpu/IESSpotLight.js +47 -0
  580. package/src/lights/webgpu/ProjectorLight.js +46 -0
  581. package/src/loaders/AnimationLoader.js +98 -0
  582. package/src/loaders/AudioLoader.js +108 -0
  583. package/src/loaders/BufferGeometryLoader.js +242 -0
  584. package/src/loaders/Cache.js +115 -0
  585. package/src/loaders/CompressedTextureLoader.js +167 -0
  586. package/src/loaders/CubeTextureLoader.js +103 -0
  587. package/src/loaders/DataTextureLoader.js +174 -0
  588. package/src/loaders/FileLoader.js +367 -0
  589. package/src/loaders/ImageBitmapLoader.js +223 -0
  590. package/src/loaders/ImageLoader.js +168 -0
  591. package/src/loaders/Loader.js +222 -0
  592. package/src/loaders/LoaderUtils.js +59 -0
  593. package/src/loaders/LoadingManager.js +329 -0
  594. package/src/loaders/MaterialLoader.js +439 -0
  595. package/src/loaders/ObjectLoader.js +1304 -0
  596. package/src/loaders/TextureLoader.js +74 -0
  597. package/src/loaders/nodes/NodeLoader.js +194 -0
  598. package/src/loaders/nodes/NodeMaterialLoader.js +108 -0
  599. package/src/loaders/nodes/NodeObjectLoader.js +169 -0
  600. package/src/materials/LineBasicMaterial.js +122 -0
  601. package/src/materials/LineDashedMaterial.js +86 -0
  602. package/src/materials/Material.js +1017 -0
  603. package/src/materials/Materials.js +39 -0
  604. package/src/materials/MeshBasicMaterial.js +250 -0
  605. package/src/materials/MeshDepthMaterial.js +148 -0
  606. package/src/materials/MeshDistanceMaterial.js +119 -0
  607. package/src/materials/MeshLambertMaterial.js +402 -0
  608. package/src/materials/MeshMatcapMaterial.js +245 -0
  609. package/src/materials/MeshNormalMaterial.js +175 -0
  610. package/src/materials/MeshPhongMaterial.js +421 -0
  611. package/src/materials/MeshPhysicalMaterial.js +536 -0
  612. package/src/materials/MeshStandardMaterial.js +425 -0
  613. package/src/materials/MeshToonMaterial.js +321 -0
  614. package/src/materials/PointsMaterial.js +139 -0
  615. package/src/materials/RawShaderMaterial.js +42 -0
  616. package/src/materials/ShaderMaterial.js +413 -0
  617. package/src/materials/ShadowMaterial.js +91 -0
  618. package/src/materials/SpriteMaterial.js +136 -0
  619. package/src/materials/nodes/Line2NodeMaterial.js +569 -0
  620. package/src/materials/nodes/LineBasicNodeMaterial.js +46 -0
  621. package/src/materials/nodes/LineDashedNodeMaterial.js +132 -0
  622. package/src/materials/nodes/MeshBasicNodeMaterial.js +134 -0
  623. package/src/materials/nodes/MeshLambertNodeMaterial.js +82 -0
  624. package/src/materials/nodes/MeshMatcapNodeMaterial.js +77 -0
  625. package/src/materials/nodes/MeshNormalNodeMaterial.js +67 -0
  626. package/src/materials/nodes/MeshPhongNodeMaterial.js +141 -0
  627. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +521 -0
  628. package/src/materials/nodes/MeshSSSNodeMaterial.js +175 -0
  629. package/src/materials/nodes/MeshStandardNodeMaterial.js +187 -0
  630. package/src/materials/nodes/MeshToonNodeMaterial.js +66 -0
  631. package/src/materials/nodes/NodeMaterial.js +1330 -0
  632. package/src/materials/nodes/NodeMaterials.js +21 -0
  633. package/src/materials/nodes/PointsNodeMaterial.js +211 -0
  634. package/src/materials/nodes/ShadowNodeMaterial.js +76 -0
  635. package/src/materials/nodes/SpriteNodeMaterial.js +186 -0
  636. package/src/materials/nodes/VolumeNodeMaterial.js +81 -0
  637. package/src/materials/nodes/manager/NodeMaterialObserver.js +718 -0
  638. package/src/math/Box2.js +381 -0
  639. package/src/math/Box3.js +805 -0
  640. package/src/math/Color.js +967 -0
  641. package/src/math/ColorManagement.js +215 -0
  642. package/src/math/Cylindrical.js +120 -0
  643. package/src/math/Euler.js +449 -0
  644. package/src/math/Frustum.js +285 -0
  645. package/src/math/FrustumArray.js +258 -0
  646. package/src/math/Interpolant.js +320 -0
  647. package/src/math/Line3.js +337 -0
  648. package/src/math/MathUtils.js +751 -0
  649. package/src/math/Matrix2.js +128 -0
  650. package/src/math/Matrix3.js +617 -0
  651. package/src/math/Matrix4.js +1314 -0
  652. package/src/math/Plane.js +368 -0
  653. package/src/math/Quaternion.js +918 -0
  654. package/src/math/Ray.js +655 -0
  655. package/src/math/Sphere.js +420 -0
  656. package/src/math/Spherical.js +147 -0
  657. package/src/math/SphericalHarmonics3.js +341 -0
  658. package/src/math/Triangle.js +539 -0
  659. package/src/math/Vector2.js +870 -0
  660. package/src/math/Vector3.js +1263 -0
  661. package/src/math/Vector4.js +1067 -0
  662. package/src/math/interpolants/BezierInterpolant.js +108 -0
  663. package/src/math/interpolants/CubicInterpolant.js +159 -0
  664. package/src/math/interpolants/DiscreteInterpolant.js +34 -0
  665. package/src/math/interpolants/LinearInterpolant.js +51 -0
  666. package/src/math/interpolants/QuaternionLinearInterpolant.js +48 -0
  667. package/src/nodes/Nodes.js +166 -0
  668. package/src/nodes/TSL.js +173 -0
  669. package/src/nodes/accessors/AccessorsUtils.js +53 -0
  670. package/src/nodes/accessors/Arrays.js +68 -0
  671. package/src/nodes/accessors/BatchNode.js +163 -0
  672. package/src/nodes/accessors/Bitangent.js +82 -0
  673. package/src/nodes/accessors/BufferAttributeNode.js +432 -0
  674. package/src/nodes/accessors/BufferNode.js +128 -0
  675. package/src/nodes/accessors/BuiltinNode.js +63 -0
  676. package/src/nodes/accessors/Camera.js +403 -0
  677. package/src/nodes/accessors/ClippingNode.js +255 -0
  678. package/src/nodes/accessors/CubeTextureNode.js +215 -0
  679. package/src/nodes/accessors/InstanceNode.js +349 -0
  680. package/src/nodes/accessors/InstancedMeshNode.js +50 -0
  681. package/src/nodes/accessors/Lights.js +139 -0
  682. package/src/nodes/accessors/MaterialNode.js +783 -0
  683. package/src/nodes/accessors/MaterialProperties.js +56 -0
  684. package/src/nodes/accessors/MaterialReferenceNode.js +84 -0
  685. package/src/nodes/accessors/ModelNode.js +184 -0
  686. package/src/nodes/accessors/ModelViewProjectionNode.js +13 -0
  687. package/src/nodes/accessors/MorphNode.js +310 -0
  688. package/src/nodes/accessors/Normal.js +243 -0
  689. package/src/nodes/accessors/Object3DNode.js +268 -0
  690. package/src/nodes/accessors/PointUVNode.js +55 -0
  691. package/src/nodes/accessors/Position.js +122 -0
  692. package/src/nodes/accessors/ReferenceBaseNode.js +357 -0
  693. package/src/nodes/accessors/ReferenceNode.js +424 -0
  694. package/src/nodes/accessors/ReflectVector.js +36 -0
  695. package/src/nodes/accessors/RendererReferenceNode.js +78 -0
  696. package/src/nodes/accessors/SceneProperties.js +47 -0
  697. package/src/nodes/accessors/SkinningNode.js +328 -0
  698. package/src/nodes/accessors/StorageBufferNode.js +405 -0
  699. package/src/nodes/accessors/StorageTextureNode.js +295 -0
  700. package/src/nodes/accessors/Tangent.js +60 -0
  701. package/src/nodes/accessors/TangentUtils.js +46 -0
  702. package/src/nodes/accessors/Texture3DNode.js +196 -0
  703. package/src/nodes/accessors/TextureBicubic.js +92 -0
  704. package/src/nodes/accessors/TextureNode.js +971 -0
  705. package/src/nodes/accessors/TextureSizeNode.js +77 -0
  706. package/src/nodes/accessors/UV.js +11 -0
  707. package/src/nodes/accessors/UniformArrayNode.js +350 -0
  708. package/src/nodes/accessors/UserDataNode.js +76 -0
  709. package/src/nodes/accessors/VelocityNode.js +224 -0
  710. package/src/nodes/accessors/VertexColorNode.js +109 -0
  711. package/src/nodes/code/CodeNode.js +181 -0
  712. package/src/nodes/code/ExpressionNode.js +68 -0
  713. package/src/nodes/code/FunctionCallNode.js +187 -0
  714. package/src/nodes/code/FunctionNode.js +182 -0
  715. package/src/nodes/core/ArrayNode.js +174 -0
  716. package/src/nodes/core/AssignNode.js +202 -0
  717. package/src/nodes/core/AttributeNode.js +168 -0
  718. package/src/nodes/core/BypassNode.js +93 -0
  719. package/src/nodes/core/ConstNode.js +67 -0
  720. package/src/nodes/core/ContextNode.js +283 -0
  721. package/src/nodes/core/IndexNode.js +165 -0
  722. package/src/nodes/core/InputNode.js +136 -0
  723. package/src/nodes/core/InspectorNode.js +128 -0
  724. package/src/nodes/core/IsolateNode.js +133 -0
  725. package/src/nodes/core/LightingModel.js +77 -0
  726. package/src/nodes/core/MRTNode.js +196 -0
  727. package/src/nodes/core/Node.js +1180 -0
  728. package/src/nodes/core/NodeAttribute.js +53 -0
  729. package/src/nodes/core/NodeBuilder.js +3299 -0
  730. package/src/nodes/core/NodeCache.js +75 -0
  731. package/src/nodes/core/NodeCode.js +46 -0
  732. package/src/nodes/core/NodeError.js +28 -0
  733. package/src/nodes/core/NodeFrame.js +314 -0
  734. package/src/nodes/core/NodeFunction.js +69 -0
  735. package/src/nodes/core/NodeFunctionInput.js +61 -0
  736. package/src/nodes/core/NodeParser.js +23 -0
  737. package/src/nodes/core/NodeUniform.js +91 -0
  738. package/src/nodes/core/NodeUtils.js +408 -0
  739. package/src/nodes/core/NodeVar.js +60 -0
  740. package/src/nodes/core/NodeVarying.js +63 -0
  741. package/src/nodes/core/OutputStructNode.js +105 -0
  742. package/src/nodes/core/ParameterNode.js +94 -0
  743. package/src/nodes/core/PropertyNode.js +367 -0
  744. package/src/nodes/core/StackNode.js +426 -0
  745. package/src/nodes/core/StackTrace.js +139 -0
  746. package/src/nodes/core/StructNode.js +134 -0
  747. package/src/nodes/core/StructType.js +13 -0
  748. package/src/nodes/core/StructTypeNode.js +148 -0
  749. package/src/nodes/core/SubBuildNode.js +89 -0
  750. package/src/nodes/core/TempNode.js +88 -0
  751. package/src/nodes/core/UniformGroupNode.js +167 -0
  752. package/src/nodes/core/UniformNode.js +259 -0
  753. package/src/nodes/core/VarNode.js +367 -0
  754. package/src/nodes/core/VaryingNode.js +210 -0
  755. package/src/nodes/core/constants.js +68 -0
  756. package/src/nodes/display/BlendModes.js +171 -0
  757. package/src/nodes/display/BumpMapNode.js +117 -0
  758. package/src/nodes/display/ColorAdjustment.js +158 -0
  759. package/src/nodes/display/ColorSpaceFunctions.js +54 -0
  760. package/src/nodes/display/ColorSpaceNode.js +164 -0
  761. package/src/nodes/display/FrontFacingNode.js +102 -0
  762. package/src/nodes/display/NormalMapNode.js +153 -0
  763. package/src/nodes/display/PassNode.js +1055 -0
  764. package/src/nodes/display/RenderOutputNode.js +150 -0
  765. package/src/nodes/display/ScreenNode.js +292 -0
  766. package/src/nodes/display/ToneMappingFunctions.js +242 -0
  767. package/src/nodes/display/ToneMappingNode.js +147 -0
  768. package/src/nodes/display/ToonOutlinePassNode.js +191 -0
  769. package/src/nodes/display/ViewportDepthNode.js +342 -0
  770. package/src/nodes/display/ViewportDepthTextureNode.js +63 -0
  771. package/src/nodes/display/ViewportSharedTextureNode.js +73 -0
  772. package/src/nodes/display/ViewportTextureNode.js +256 -0
  773. package/src/nodes/fog/Fog.js +97 -0
  774. package/src/nodes/functions/BSDF/BRDF_GGX.js +55 -0
  775. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  776. package/src/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  777. package/src/nodes/functions/BSDF/BRDF_Sheen.js +57 -0
  778. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  779. package/src/nodes/functions/BSDF/D_GGX.js +23 -0
  780. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  781. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  782. package/src/nodes/functions/BSDF/F_Schlick.js +16 -0
  783. package/src/nodes/functions/BSDF/LTC.js +175 -0
  784. package/src/nodes/functions/BSDF/Schlick_to_F0.js +21 -0
  785. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +26 -0
  786. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  787. package/src/nodes/functions/BasicLightingModel.js +100 -0
  788. package/src/nodes/functions/PhongLightingModel.js +99 -0
  789. package/src/nodes/functions/PhysicalLightingModel.js +878 -0
  790. package/src/nodes/functions/ShadowMaskModel.js +58 -0
  791. package/src/nodes/functions/ToonLightingModel.js +70 -0
  792. package/src/nodes/functions/VolumetricLightingModel.js +183 -0
  793. package/src/nodes/functions/material/getAlphaHashThreshold.js +68 -0
  794. package/src/nodes/functions/material/getGeometryRoughness.js +19 -0
  795. package/src/nodes/functions/material/getParallaxCorrectNormal.js +37 -0
  796. package/src/nodes/functions/material/getRoughness.js +18 -0
  797. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  798. package/src/nodes/geometry/RangeNode.js +210 -0
  799. package/src/nodes/gpgpu/AtomicFunctionNode.js +274 -0
  800. package/src/nodes/gpgpu/BarrierNode.js +98 -0
  801. package/src/nodes/gpgpu/ComputeBuiltinNode.js +227 -0
  802. package/src/nodes/gpgpu/ComputeNode.js +310 -0
  803. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  804. package/src/nodes/gpgpu/WorkgroupInfoNode.js +234 -0
  805. package/src/nodes/lighting/AONode.js +45 -0
  806. package/src/nodes/lighting/AmbientLightNode.js +35 -0
  807. package/src/nodes/lighting/AnalyticLightNode.js +309 -0
  808. package/src/nodes/lighting/BasicEnvironmentNode.js +49 -0
  809. package/src/nodes/lighting/BasicLightMapNode.js +49 -0
  810. package/src/nodes/lighting/DirectionalLightNode.js +39 -0
  811. package/src/nodes/lighting/EnvironmentNode.js +178 -0
  812. package/src/nodes/lighting/HemisphereLightNode.js +87 -0
  813. package/src/nodes/lighting/IESSpotLightNode.js +49 -0
  814. package/src/nodes/lighting/IrradianceNode.js +44 -0
  815. package/src/nodes/lighting/LightProbeNode.js +73 -0
  816. package/src/nodes/lighting/LightUtils.js +25 -0
  817. package/src/nodes/lighting/LightingContextNode.js +115 -0
  818. package/src/nodes/lighting/LightingNode.js +36 -0
  819. package/src/nodes/lighting/LightsNode.js +432 -0
  820. package/src/nodes/lighting/PointLightNode.js +102 -0
  821. package/src/nodes/lighting/PointShadowNode.js +325 -0
  822. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  823. package/src/nodes/lighting/RectAreaLightNode.js +133 -0
  824. package/src/nodes/lighting/ShadowBaseNode.js +81 -0
  825. package/src/nodes/lighting/ShadowFilterNode.js +264 -0
  826. package/src/nodes/lighting/ShadowNode.js +889 -0
  827. package/src/nodes/lighting/SpotLightNode.js +168 -0
  828. package/src/nodes/materialx/DISCLAIMER.md +199 -0
  829. package/src/nodes/materialx/MaterialXNodes.js +197 -0
  830. package/src/nodes/materialx/lib/mx_hsv.js +127 -0
  831. package/src/nodes/materialx/lib/mx_noise.js +1491 -0
  832. package/src/nodes/materialx/lib/mx_transform_color.js +23 -0
  833. package/src/nodes/math/BitcastNode.js +156 -0
  834. package/src/nodes/math/BitcountNode.js +433 -0
  835. package/src/nodes/math/ConditionalNode.js +245 -0
  836. package/src/nodes/math/Hash.js +21 -0
  837. package/src/nodes/math/MathNode.js +1202 -0
  838. package/src/nodes/math/MathUtils.js +54 -0
  839. package/src/nodes/math/OperatorNode.js +752 -0
  840. package/src/nodes/math/PackFloatNode.js +98 -0
  841. package/src/nodes/math/TriNoise3D.js +71 -0
  842. package/src/nodes/math/UnpackFloatNode.js +96 -0
  843. package/src/nodes/parsers/GLSLNodeFunction.js +168 -0
  844. package/src/nodes/parsers/GLSLNodeParser.js +25 -0
  845. package/src/nodes/pmrem/PMREMNode.js +397 -0
  846. package/src/nodes/pmrem/PMREMUtils.js +397 -0
  847. package/src/nodes/procedural/Checker.js +22 -0
  848. package/src/nodes/shapes/Shapes.js +33 -0
  849. package/src/nodes/tsl/TSLBase.js +36 -0
  850. package/src/nodes/tsl/TSLCore.js +1250 -0
  851. package/src/nodes/utils/ArrayElementNode.js +90 -0
  852. package/src/nodes/utils/ConvertNode.js +100 -0
  853. package/src/nodes/utils/CubeMapNode.js +237 -0
  854. package/src/nodes/utils/DebugNode.js +83 -0
  855. package/src/nodes/utils/Discard.js +24 -0
  856. package/src/nodes/utils/EquirectUV.js +27 -0
  857. package/src/nodes/utils/EventNode.js +148 -0
  858. package/src/nodes/utils/FlipNode.js +106 -0
  859. package/src/nodes/utils/FunctionOverloadingNode.js +170 -0
  860. package/src/nodes/utils/JoinNode.js +117 -0
  861. package/src/nodes/utils/LoopNode.js +349 -0
  862. package/src/nodes/utils/MatcapUV.js +22 -0
  863. package/src/nodes/utils/MaxMipLevelNode.js +103 -0
  864. package/src/nodes/utils/MemberNode.js +120 -0
  865. package/src/nodes/utils/Oscillators.js +41 -0
  866. package/src/nodes/utils/Packing.js +33 -0
  867. package/src/nodes/utils/PostProcessingUtils.js +154 -0
  868. package/src/nodes/utils/RTTNode.js +289 -0
  869. package/src/nodes/utils/ReflectorNode.js +629 -0
  870. package/src/nodes/utils/Remap.js +48 -0
  871. package/src/nodes/utils/RotateNode.js +103 -0
  872. package/src/nodes/utils/SampleNode.js +91 -0
  873. package/src/nodes/utils/SetNode.js +108 -0
  874. package/src/nodes/utils/SplitNode.js +179 -0
  875. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  876. package/src/nodes/utils/SpriteUtils.js +63 -0
  877. package/src/nodes/utils/StorageArrayElementNode.js +143 -0
  878. package/src/nodes/utils/Timer.js +26 -0
  879. package/src/nodes/utils/TriplanarTextures.js +65 -0
  880. package/src/nodes/utils/UVUtils.js +67 -0
  881. package/src/nodes/utils/ViewportUtils.js +26 -0
  882. package/src/objects/BatchedMesh.js +1682 -0
  883. package/src/objects/Bone.js +41 -0
  884. package/src/objects/ClippingGroup.js +68 -0
  885. package/src/objects/Group.js +41 -0
  886. package/src/objects/InstancedMesh.js +422 -0
  887. package/src/objects/LOD.js +329 -0
  888. package/src/objects/Line.js +329 -0
  889. package/src/objects/LineLoop.js +37 -0
  890. package/src/objects/LineSegments.js +74 -0
  891. package/src/objects/Mesh.js +496 -0
  892. package/src/objects/Points.js +228 -0
  893. package/src/objects/Skeleton.js +392 -0
  894. package/src/objects/SkinnedMesh.js +370 -0
  895. package/src/objects/Sprite.js +245 -0
  896. package/src/renderers/WebGL3DRenderTarget.js +48 -0
  897. package/src/renderers/WebGLArrayRenderTarget.js +48 -0
  898. package/src/renderers/WebGLCubeRenderTarget.js +182 -0
  899. package/src/renderers/WebGLRenderTarget.js +34 -0
  900. package/src/renderers/WebGLRenderer.js +3699 -0
  901. package/src/renderers/common/Animation.js +159 -0
  902. package/src/renderers/common/Attributes.js +132 -0
  903. package/src/renderers/common/Backend.js +769 -0
  904. package/src/renderers/common/Background.js +225 -0
  905. package/src/renderers/common/BindGroup.js +46 -0
  906. package/src/renderers/common/Binding.js +71 -0
  907. package/src/renderers/common/Bindings.js +394 -0
  908. package/src/renderers/common/BlendMode.js +143 -0
  909. package/src/renderers/common/Buffer.js +127 -0
  910. package/src/renderers/common/BufferUtils.js +58 -0
  911. package/src/renderers/common/BundleGroup.js +83 -0
  912. package/src/renderers/common/CanvasTarget.js +341 -0
  913. package/src/renderers/common/ChainMap.js +122 -0
  914. package/src/renderers/common/ClippingContext.js +262 -0
  915. package/src/renderers/common/Color4.js +77 -0
  916. package/src/renderers/common/ComputePipeline.js +41 -0
  917. package/src/renderers/common/Constants.js +15 -0
  918. package/src/renderers/common/CubeRenderTarget.js +147 -0
  919. package/src/renderers/common/DataMap.js +90 -0
  920. package/src/renderers/common/Geometries.js +396 -0
  921. package/src/renderers/common/IndirectStorageBufferAttribute.js +38 -0
  922. package/src/renderers/common/Info.js +501 -0
  923. package/src/renderers/common/InspectorBase.js +151 -0
  924. package/src/renderers/common/Lighting.js +57 -0
  925. package/src/renderers/common/Pipeline.js +35 -0
  926. package/src/renderers/common/Pipelines.js +498 -0
  927. package/src/renderers/common/PostProcessing.js +28 -0
  928. package/src/renderers/common/ProgrammableStage.js +78 -0
  929. package/src/renderers/common/QuadMesh.js +112 -0
  930. package/src/renderers/common/ReadbackBuffer.js +78 -0
  931. package/src/renderers/common/RenderBundle.js +26 -0
  932. package/src/renderers/common/RenderBundles.js +71 -0
  933. package/src/renderers/common/RenderContext.js +281 -0
  934. package/src/renderers/common/RenderContexts.js +100 -0
  935. package/src/renderers/common/RenderList.js +404 -0
  936. package/src/renderers/common/RenderLists.js +78 -0
  937. package/src/renderers/common/RenderObject.js +915 -0
  938. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  939. package/src/renderers/common/RenderObjects.js +218 -0
  940. package/src/renderers/common/RenderPipeline.js +255 -0
  941. package/src/renderers/common/Renderer.js +3654 -0
  942. package/src/renderers/common/RendererUtils.js +200 -0
  943. package/src/renderers/common/SampledTexture.js +152 -0
  944. package/src/renderers/common/Sampler.js +165 -0
  945. package/src/renderers/common/Storage3DTexture.js +100 -0
  946. package/src/renderers/common/StorageArrayTexture.js +84 -0
  947. package/src/renderers/common/StorageBuffer.js +53 -0
  948. package/src/renderers/common/StorageBufferAttribute.js +46 -0
  949. package/src/renderers/common/StorageInstancedBufferAttribute.js +46 -0
  950. package/src/renderers/common/StorageTexture.js +86 -0
  951. package/src/renderers/common/Textures.js +629 -0
  952. package/src/renderers/common/TimestampQueryPool.js +163 -0
  953. package/src/renderers/common/Uniform.js +375 -0
  954. package/src/renderers/common/UniformBuffer.js +34 -0
  955. package/src/renderers/common/UniformsGroup.js +548 -0
  956. package/src/renderers/common/XRManager.js +1684 -0
  957. package/src/renderers/common/XRRenderTarget.js +91 -0
  958. package/src/renderers/common/extras/PMREMGenerator.js +1042 -0
  959. package/src/renderers/common/nodes/NodeBuilderState.js +152 -0
  960. package/src/renderers/common/nodes/NodeLibrary.js +196 -0
  961. package/src/renderers/common/nodes/NodeManager.js +983 -0
  962. package/src/renderers/common/nodes/NodeSampledTexture.js +140 -0
  963. package/src/renderers/common/nodes/NodeSampler.js +62 -0
  964. package/src/renderers/common/nodes/NodeStorageBuffer.js +72 -0
  965. package/src/renderers/common/nodes/NodeUniform.js +418 -0
  966. package/src/renderers/common/nodes/NodeUniformBuffer.js +105 -0
  967. package/src/renderers/common/nodes/NodeUniformsGroup.js +51 -0
  968. package/src/renderers/shaders/DFGLUTData.js +49 -0
  969. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  970. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  971. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +7 -0
  972. package/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js +7 -0
  973. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +16 -0
  974. package/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js +5 -0
  975. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +26 -0
  976. package/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js +8 -0
  977. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +49 -0
  978. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  979. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +9 -0
  980. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -0
  981. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +33 -0
  982. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +43 -0
  983. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +7 -0
  984. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +10 -0
  985. package/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js +21 -0
  986. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +78 -0
  987. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js +9 -0
  988. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js +7 -0
  989. package/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js +7 -0
  990. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +7 -0
  991. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +7 -0
  992. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +7 -0
  993. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +29 -0
  994. package/src/renderers/shaders/ShaderChunk/colorspace_fragment.glsl.js +3 -0
  995. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +15 -0
  996. package/src/renderers/shaders/ShaderChunk/common.glsl.js +125 -0
  997. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +186 -0
  998. package/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js +5 -0
  999. package/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js +5 -0
  1000. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +63 -0
  1001. package/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js +9 -0
  1002. package/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js +7 -0
  1003. package/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js +7 -0
  1004. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +20 -0
  1005. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +17 -0
  1006. package/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js +7 -0
  1007. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +14 -0
  1008. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +58 -0
  1009. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +21 -0
  1010. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +22 -0
  1011. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +69 -0
  1012. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +37 -0
  1013. package/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js +17 -0
  1014. package/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js +19 -0
  1015. package/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js +7 -0
  1016. package/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js +7 -0
  1017. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +27 -0
  1018. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +120 -0
  1019. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  1020. package/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js +8 -0
  1021. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  1022. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +213 -0
  1023. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +19 -0
  1024. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +44 -0
  1025. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  1026. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +28 -0
  1027. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +216 -0
  1028. package/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js +7 -0
  1029. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +32 -0
  1030. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +161 -0
  1031. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +656 -0
  1032. package/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js +4 -0
  1033. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +26 -0
  1034. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +9 -0
  1035. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +9 -0
  1036. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +8 -0
  1037. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +8 -0
  1038. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +17 -0
  1039. package/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js +7 -0
  1040. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +27 -0
  1041. package/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js +27 -0
  1042. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +12 -0
  1043. package/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js +7 -0
  1044. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  1045. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  1046. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +16 -0
  1047. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +26 -0
  1048. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +16 -0
  1049. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +76 -0
  1050. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +40 -0
  1051. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +14 -0
  1052. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +14 -0
  1053. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +14 -0
  1054. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +43 -0
  1055. package/src/renderers/shaders/ShaderChunk/opaque_fragment.glsl.js +11 -0
  1056. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +116 -0
  1057. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +7 -0
  1058. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +19 -0
  1059. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -0
  1060. package/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js +7 -0
  1061. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +376 -0
  1062. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +71 -0
  1063. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +78 -0
  1064. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +66 -0
  1065. package/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js +10 -0
  1066. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +25 -0
  1067. package/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js +15 -0
  1068. package/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js +20 -0
  1069. package/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js +14 -0
  1070. package/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js +7 -0
  1071. package/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js +7 -0
  1072. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +200 -0
  1073. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +36 -0
  1074. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +235 -0
  1075. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +119 -0
  1076. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +145 -0
  1077. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +122 -0
  1078. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +21 -0
  1079. package/src/renderers/shaders/ShaderChunk.js +272 -0
  1080. package/src/renderers/shaders/ShaderLib/background.glsl.js +40 -0
  1081. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  1082. package/src/renderers/shaders/ShaderLib/cube.glsl.js +36 -0
  1083. package/src/renderers/shaders/ShaderLib/depth.glsl.js +117 -0
  1084. package/src/renderers/shaders/ShaderLib/distance.glsl.js +77 -0
  1085. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +35 -0
  1086. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +76 -0
  1087. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +116 -0
  1088. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +126 -0
  1089. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +112 -0
  1090. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +86 -0
  1091. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +128 -0
  1092. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +224 -0
  1093. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +118 -0
  1094. package/src/renderers/shaders/ShaderLib/points.glsl.js +87 -0
  1095. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +58 -0
  1096. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +79 -0
  1097. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +51 -0
  1098. package/src/renderers/shaders/ShaderLib.js +362 -0
  1099. package/src/renderers/shaders/UniformsLib.js +234 -0
  1100. package/src/renderers/shaders/UniformsUtils.js +154 -0
  1101. package/src/renderers/webgl/WebGLAnimation.js +54 -0
  1102. package/src/renderers/webgl/WebGLAttributes.js +237 -0
  1103. package/src/renderers/webgl/WebGLBackground.js +303 -0
  1104. package/src/renderers/webgl/WebGLBindingStates.js +666 -0
  1105. package/src/renderers/webgl/WebGLBufferRenderer.js +57 -0
  1106. package/src/renderers/webgl/WebGLCapabilities.js +150 -0
  1107. package/src/renderers/webgl/WebGLClipping.js +171 -0
  1108. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  1109. package/src/renderers/webgl/WebGLExtensions.js +61 -0
  1110. package/src/renderers/webgl/WebGLGeometries.js +186 -0
  1111. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +68 -0
  1112. package/src/renderers/webgl/WebGLInfo.js +73 -0
  1113. package/src/renderers/webgl/WebGLLights.js +584 -0
  1114. package/src/renderers/webgl/WebGLMaterials.js +602 -0
  1115. package/src/renderers/webgl/WebGLMorphtargets.js +168 -0
  1116. package/src/renderers/webgl/WebGLObjects.js +94 -0
  1117. package/src/renderers/webgl/WebGLOutput.js +270 -0
  1118. package/src/renderers/webgl/WebGLProgram.js +1031 -0
  1119. package/src/renderers/webgl/WebGLPrograms.js +679 -0
  1120. package/src/renderers/webgl/WebGLProperties.js +55 -0
  1121. package/src/renderers/webgl/WebGLRenderLists.js +253 -0
  1122. package/src/renderers/webgl/WebGLRenderStates.js +124 -0
  1123. package/src/renderers/webgl/WebGLShader.js +12 -0
  1124. package/src/renderers/webgl/WebGLShaderCache.js +124 -0
  1125. package/src/renderers/webgl/WebGLShadowMap.js +600 -0
  1126. package/src/renderers/webgl/WebGLState.js +1370 -0
  1127. package/src/renderers/webgl/WebGLTextures.js +2506 -0
  1128. package/src/renderers/webgl/WebGLUniforms.js +1203 -0
  1129. package/src/renderers/webgl/WebGLUniformsGroups.js +413 -0
  1130. package/src/renderers/webgl/WebGLUtils.js +217 -0
  1131. package/src/renderers/webgl-fallback/WebGLBackend.js +2783 -0
  1132. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +99 -0
  1133. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +1676 -0
  1134. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +359 -0
  1135. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +89 -0
  1136. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +13 -0
  1137. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +83 -0
  1138. package/src/renderers/webgl-fallback/utils/WebGLState.js +1361 -0
  1139. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1324 -0
  1140. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +396 -0
  1141. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +317 -0
  1142. package/src/renderers/webgpu/WebGPUBackend.js +2602 -0
  1143. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +69 -0
  1144. package/src/renderers/webgpu/WebGPURenderer.js +107 -0
  1145. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +66 -0
  1146. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +100 -0
  1147. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +2523 -0
  1148. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +187 -0
  1149. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +25 -0
  1150. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +522 -0
  1151. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +642 -0
  1152. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  1153. package/src/renderers/webgpu/utils/WebGPUConstants.js +354 -0
  1154. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +846 -0
  1155. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +389 -0
  1156. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1673 -0
  1157. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +310 -0
  1158. package/src/renderers/webgpu/utils/WebGPUUtils.js +269 -0
  1159. package/src/renderers/webxr/WebXRController.js +440 -0
  1160. package/src/renderers/webxr/WebXRDepthSensing.js +155 -0
  1161. package/src/renderers/webxr/WebXRManager.js +1103 -0
  1162. package/src/scenes/Fog.js +98 -0
  1163. package/src/scenes/FogExp2.js +86 -0
  1164. package/src/scenes/Scene.js +165 -0
  1165. package/src/textures/CanvasTexture.js +45 -0
  1166. package/src/textures/CompressedArrayTexture.js +89 -0
  1167. package/src/textures/CompressedCubeTexture.js +48 -0
  1168. package/src/textures/CompressedTexture.js +86 -0
  1169. package/src/textures/CubeDepthTexture.js +76 -0
  1170. package/src/textures/CubeTexture.js +81 -0
  1171. package/src/textures/Data3DTexture.js +112 -0
  1172. package/src/textures/DataArrayTexture.js +134 -0
  1173. package/src/textures/DataTexture.js +87 -0
  1174. package/src/textures/DepthTexture.js +104 -0
  1175. package/src/textures/ExternalTexture.js +56 -0
  1176. package/src/textures/FramebufferTexture.js +85 -0
  1177. package/src/textures/HTMLTexture.js +74 -0
  1178. package/src/textures/Source.js +230 -0
  1179. package/src/textures/Texture.js +812 -0
  1180. package/src/textures/VideoFrameTexture.js +72 -0
  1181. package/src/textures/VideoTexture.js +127 -0
  1182. package/src/utils.js +493 -0
@@ -0,0 +1,2602 @@
1
+ /*// debugger tools
2
+ import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
3
+ //*/
4
+
5
+ import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension, GPUFeatureMap } from './utils/WebGPUConstants.js';
6
+
7
+ import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
8
+ import Backend from '../common/Backend.js';
9
+
10
+ import WebGPUUtils from './utils/WebGPUUtils.js';
11
+ import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
12
+ import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
13
+ import WebGPUCapabilities from './utils/WebGPUCapabilities.js';
14
+ import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
15
+ import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
16
+
17
+ import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType, Compatibility } from '../../constants.js';
18
+ import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js';
19
+ import { error } from '../../utils.js';
20
+
21
+ const _clearValue = { r: 0, g: 0, b: 0, a: 1 };
22
+
23
+ /**
24
+ * A backend implementation targeting WebGPU.
25
+ *
26
+ * @private
27
+ * @augments Backend
28
+ */
29
+ class WebGPUBackend extends Backend {
30
+
31
+ /**
32
+ * WebGPUBackend options.
33
+ *
34
+ * @typedef {Object} WebGPUBackend~Options
35
+ * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
36
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
37
+ * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
38
+ * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
39
+ * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
40
+ * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
41
+ * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
42
+ * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
43
+ * @property {boolean} [trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not.
44
+ * @property {string} [powerPreference=undefined] - The power preference.
45
+ * @property {Object} [requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits.
46
+ * @property {GPUDevice} [device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter.
47
+ * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
48
+ */
49
+
50
+ /**
51
+ * Constructs a new WebGPU backend.
52
+ *
53
+ * @param {WebGPUBackend~Options} [parameters] - The configuration parameter.
54
+ */
55
+ constructor( parameters = {} ) {
56
+
57
+ super( parameters );
58
+
59
+ /**
60
+ * This flag can be used for type testing.
61
+ *
62
+ * @type {boolean}
63
+ * @readonly
64
+ * @default true
65
+ */
66
+ this.isWebGPUBackend = true;
67
+
68
+ // some parameters require default values other than "undefined"
69
+ this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
70
+
71
+ this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
72
+
73
+ /**
74
+ * Indicates whether the backend is in WebGPU compatibility mode or not.
75
+ * The backend must be initialized before the property can be evaluated.
76
+ *
77
+ * @type {?boolean}
78
+ * @readonly
79
+ * @default null
80
+ */
81
+ this.compatibilityMode = null;
82
+
83
+ /**
84
+ * A reference to the device.
85
+ *
86
+ * @type {?GPUDevice}
87
+ * @default null
88
+ */
89
+ this.device = null;
90
+
91
+ /**
92
+ * A reference to the default render pass descriptor.
93
+ *
94
+ * @type {?Object}
95
+ * @default null
96
+ */
97
+ this.defaultRenderPassdescriptor = null;
98
+
99
+ /**
100
+ * A reference to a backend module holding common utility functions.
101
+ *
102
+ * @type {WebGPUUtils}
103
+ */
104
+ this.utils = new WebGPUUtils( this );
105
+
106
+ /**
107
+ * A reference to a backend module holding shader attribute-related
108
+ * utility functions.
109
+ *
110
+ * @type {WebGPUAttributeUtils}
111
+ */
112
+ this.attributeUtils = new WebGPUAttributeUtils( this );
113
+
114
+ /**
115
+ * A reference to a backend module holding shader binding-related
116
+ * utility functions.
117
+ *
118
+ * @type {WebGPUBindingUtils}
119
+ */
120
+ this.bindingUtils = new WebGPUBindingUtils( this );
121
+
122
+ /**
123
+ * A reference to a backend module holding device capability related
124
+ * utility functions.
125
+ *
126
+ * @type {WebGPUCapabilities}
127
+ */
128
+ this.capabilities = new WebGPUCapabilities( this );
129
+
130
+ /**
131
+ * A reference to a backend module holding shader pipeline-related
132
+ * utility functions.
133
+ *
134
+ * @type {WebGPUPipelineUtils}
135
+ */
136
+ this.pipelineUtils = new WebGPUPipelineUtils( this );
137
+
138
+ /**
139
+ * A reference to a backend module holding shader texture-related
140
+ * utility functions.
141
+ *
142
+ * @type {WebGPUTextureUtils}
143
+ */
144
+ this.textureUtils = new WebGPUTextureUtils( this );
145
+
146
+ /**
147
+ * A map that manages the resolve buffers for occlusion queries.
148
+ *
149
+ * @type {Map<number,GPUBuffer>}
150
+ */
151
+ this.occludedResolveCache = new Map();
152
+
153
+ // compatibility checks
154
+
155
+ const compatibilityTextureCompare = typeof navigator === 'undefined' ? true : /Android/.test( navigator.userAgent ) === false;
156
+
157
+ /**
158
+ * A map of compatibility checks.
159
+ *
160
+ * @type {Object}
161
+ */
162
+ this._compatibility = {
163
+ [ Compatibility.TEXTURE_COMPARE ]: compatibilityTextureCompare
164
+ };
165
+
166
+ }
167
+
168
+ /**
169
+ * Initializes the backend so it is ready for usage.
170
+ *
171
+ * @async
172
+ * @param {Renderer} renderer - The renderer.
173
+ * @return {Promise} A Promise that resolves when the backend has been initialized.
174
+ */
175
+ async init( renderer ) {
176
+
177
+ await super.init( renderer );
178
+
179
+ //
180
+
181
+ const parameters = this.parameters;
182
+
183
+ // create the device if it is not passed with parameters
184
+
185
+ let device;
186
+
187
+ if ( parameters.device === undefined ) {
188
+
189
+ const adapterOptions = {
190
+ powerPreference: parameters.powerPreference,
191
+ featureLevel: 'compatibility'
192
+ };
193
+
194
+ const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
195
+
196
+ if ( adapter === null ) {
197
+
198
+ throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
199
+
200
+ }
201
+
202
+ // feature support
203
+
204
+ const features = Object.values( GPUFeatureName );
205
+
206
+ const supportedFeatures = [];
207
+
208
+ for ( const name of features ) {
209
+
210
+ if ( adapter.features.has( name ) ) {
211
+
212
+ supportedFeatures.push( name );
213
+
214
+ }
215
+
216
+ }
217
+
218
+ const deviceDescriptor = {
219
+ requiredFeatures: supportedFeatures,
220
+ requiredLimits: parameters.requiredLimits
221
+ };
222
+
223
+ device = await adapter.requestDevice( deviceDescriptor );
224
+
225
+ } else {
226
+
227
+ device = parameters.device;
228
+
229
+ }
230
+
231
+ this.compatibilityMode = ! device.features.has( 'core-features-and-limits' );
232
+
233
+ if ( this.compatibilityMode ) {
234
+
235
+ renderer._samples = 0;
236
+
237
+ }
238
+
239
+ device.lost.then( ( info ) => {
240
+
241
+ if ( info.reason === 'destroyed' ) return;
242
+
243
+ const deviceLossInfo = {
244
+ api: 'WebGPU',
245
+ message: info.message || 'Unknown reason',
246
+ reason: info.reason || null,
247
+ originalEvent: info
248
+ };
249
+
250
+ renderer.onDeviceLost( deviceLossInfo );
251
+
252
+ } );
253
+
254
+ this.device = device;
255
+
256
+ this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );
257
+
258
+ this.updateSize();
259
+
260
+ }
261
+
262
+ /**
263
+ * A reference to the context.
264
+ *
265
+ * @type {?GPUCanvasContext}
266
+ * @default null
267
+ */
268
+ get context() {
269
+
270
+ const canvasTarget = this.renderer.getCanvasTarget();
271
+ const canvasData = this.get( canvasTarget );
272
+
273
+ let context = canvasData.context;
274
+
275
+ if ( context === undefined ) {
276
+
277
+ const parameters = this.parameters;
278
+
279
+ if ( canvasTarget.isDefaultCanvasTarget === true && parameters.context !== undefined ) {
280
+
281
+ context = parameters.context;
282
+
283
+ } else {
284
+
285
+ context = canvasTarget.domElement.getContext( 'webgpu' );
286
+
287
+ }
288
+
289
+ // OffscreenCanvas does not have setAttribute, see #22811
290
+ if ( 'setAttribute' in canvasTarget.domElement ) canvasTarget.domElement.setAttribute( 'data-engine', `three.js r${ REVISION } webgpu` );
291
+
292
+ const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
293
+
294
+ const toneMappingMode = parameters.outputType === HalfFloatType ? 'extended' : 'standard';
295
+
296
+ context.configure( {
297
+ device: this.device,
298
+ format: this.utils.getPreferredCanvasFormat(),
299
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
300
+ alphaMode: alphaMode,
301
+ toneMapping: {
302
+ mode: toneMappingMode
303
+ }
304
+ } );
305
+
306
+ canvasData.context = context;
307
+
308
+ }
309
+
310
+ return context;
311
+
312
+ }
313
+
314
+ /**
315
+ * The coordinate system of the backend.
316
+ *
317
+ * @type {number}
318
+ * @readonly
319
+ */
320
+ get coordinateSystem() {
321
+
322
+ return WebGPUCoordinateSystem;
323
+
324
+ }
325
+
326
+ /**
327
+ * This method performs a readback operation by moving buffer data from
328
+ * a storage buffer attribute from the GPU to the CPU. ReadbackBuffer can
329
+ * be used to retain and reuse handles to the intermediate buffers and prevent
330
+ * new allocation.
331
+ *
332
+ * @async
333
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
334
+ * @param {number} count - The offset from which to start reading the
335
+ * @param {number} offset - The storage buffer attribute.
336
+ * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
337
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
338
+ */
339
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
340
+
341
+ return await this.attributeUtils.getArrayBufferAsync( attribute, target, offset, count );
342
+
343
+ }
344
+
345
+ /**
346
+ * Returns the backend's rendering context.
347
+ *
348
+ * @return {GPUCanvasContext} The rendering context.
349
+ */
350
+ getContext() {
351
+
352
+ return this.context;
353
+
354
+ }
355
+
356
+ /**
357
+ * Returns the default render pass descriptor.
358
+ *
359
+ * In WebGPU, the default framebuffer must be configured
360
+ * like custom framebuffers so the backend needs a render
361
+ * pass descriptor even when rendering directly to screen.
362
+ *
363
+ * @private
364
+ * @return {Object} The render pass descriptor.
365
+ */
366
+ _getDefaultRenderPassDescriptor() {
367
+
368
+ const renderer = this.renderer;
369
+ const canvasTarget = renderer.getCanvasTarget();
370
+ const canvasData = this.get( canvasTarget );
371
+ const samples = renderer.currentSamples;
372
+
373
+ let descriptor = canvasData.descriptor;
374
+
375
+ if ( descriptor === undefined || canvasData.samples !== samples ) {
376
+
377
+ descriptor = {
378
+ colorAttachments: [ {
379
+ view: null
380
+ } ]
381
+ };
382
+
383
+ if ( renderer.depth === true || renderer.stencil === true ) {
384
+
385
+ descriptor.depthStencilAttachment = {
386
+ view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
387
+ };
388
+
389
+ }
390
+
391
+ const colorAttachment = descriptor.colorAttachments[ 0 ];
392
+
393
+ if ( samples > 0 ) {
394
+
395
+ colorAttachment.view = this.textureUtils.getColorBuffer().createView();
396
+
397
+ } else {
398
+
399
+ colorAttachment.resolveTarget = undefined;
400
+
401
+ }
402
+
403
+ canvasData.descriptor = descriptor;
404
+ canvasData.samples = samples;
405
+
406
+ }
407
+
408
+ const colorAttachment = descriptor.colorAttachments[ 0 ];
409
+
410
+ if ( samples > 0 ) {
411
+
412
+ colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
413
+
414
+ } else {
415
+
416
+ colorAttachment.view = this.context.getCurrentTexture().createView();
417
+
418
+ }
419
+
420
+ return descriptor;
421
+
422
+ }
423
+
424
+ /**
425
+ * Internal to determine if the current render target is a render target array with depth 2D array texture.
426
+ *
427
+ * @param {RenderContext} renderContext - The render context.
428
+ * @return {boolean} Whether the render target is a render target array with depth 2D array texture.
429
+ *
430
+ * @private
431
+ */
432
+ _isRenderCameraDepthArray( renderContext ) {
433
+
434
+ return renderContext.depthTexture && renderContext.depthTexture.image.depth > 1 && renderContext.camera.isArrayCamera;
435
+
436
+ }
437
+
438
+ /**
439
+ * Returns the render pass descriptor for the given render context.
440
+ *
441
+ * @private
442
+ * @param {RenderContext} renderContext - The render context.
443
+ * @param {Object} colorAttachmentsConfig - Configuration object for the color attachments.
444
+ * @return {Object} The render pass descriptor.
445
+ */
446
+ _getRenderPassDescriptor( renderContext, colorAttachmentsConfig = {} ) {
447
+
448
+ const renderTarget = renderContext.renderTarget;
449
+ const renderTargetData = this.get( renderTarget );
450
+
451
+ let descriptors = renderTargetData.descriptors;
452
+
453
+ if ( descriptors === undefined ||
454
+ renderTargetData.width !== renderTarget.width ||
455
+ renderTargetData.height !== renderTarget.height ||
456
+ renderTargetData.samples !== renderTarget.samples
457
+ ) {
458
+
459
+ descriptors = {};
460
+
461
+ renderTargetData.descriptors = descriptors;
462
+
463
+ }
464
+
465
+ const cacheKey = renderContext.getCacheKey();
466
+ let descriptorBase = descriptors[ cacheKey ];
467
+
468
+ if ( descriptorBase === undefined ) {
469
+
470
+ const textures = renderContext.textures;
471
+ const textureViews = [];
472
+
473
+ let sliceIndex;
474
+
475
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( renderContext );
476
+
477
+ for ( let i = 0; i < textures.length; i ++ ) {
478
+
479
+ const textureData = this.get( textures[ i ] );
480
+
481
+ const viewDescriptor = {
482
+ label: `colorAttachment_${ i }`,
483
+ baseMipLevel: renderContext.activeMipmapLevel,
484
+ mipLevelCount: 1,
485
+ baseArrayLayer: renderContext.activeCubeFace,
486
+ arrayLayerCount: 1,
487
+ dimension: GPUTextureViewDimension.TwoD
488
+ };
489
+
490
+ if ( renderTarget.isRenderTarget3D ) {
491
+
492
+ sliceIndex = renderContext.activeCubeFace;
493
+
494
+ viewDescriptor.baseArrayLayer = 0;
495
+ viewDescriptor.dimension = GPUTextureViewDimension.ThreeD;
496
+ viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
497
+
498
+ } else if ( renderTarget.isRenderTarget && textures[ i ].image.depth > 1 ) {
499
+
500
+ if ( isRenderCameraDepthArray === true ) {
501
+
502
+ const cameras = renderContext.camera.cameras;
503
+ for ( let layer = 0; layer < cameras.length; layer ++ ) {
504
+
505
+ const layerViewDescriptor = {
506
+ ...viewDescriptor,
507
+ baseArrayLayer: layer,
508
+ arrayLayerCount: 1,
509
+ dimension: GPUTextureViewDimension.TwoD
510
+ };
511
+ const textureView = textureData.texture.createView( layerViewDescriptor );
512
+ textureViews.push( {
513
+ view: textureView,
514
+ resolveTarget: undefined,
515
+ depthSlice: undefined
516
+ } );
517
+
518
+ }
519
+
520
+ } else {
521
+
522
+ viewDescriptor.dimension = GPUTextureViewDimension.TwoDArray;
523
+ viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
524
+
525
+ }
526
+
527
+ }
528
+
529
+ if ( isRenderCameraDepthArray !== true ) {
530
+
531
+ const textureView = textureData.texture.createView( viewDescriptor );
532
+
533
+ let view, resolveTarget;
534
+
535
+ if ( textureData.msaaTexture !== undefined ) {
536
+
537
+ view = textureData.msaaTexture.createView();
538
+ resolveTarget = textureView;
539
+
540
+ } else {
541
+
542
+ view = textureView;
543
+ resolveTarget = undefined;
544
+
545
+ }
546
+
547
+ textureViews.push( {
548
+ view,
549
+ resolveTarget,
550
+ depthSlice: sliceIndex
551
+ } );
552
+
553
+ }
554
+
555
+ }
556
+
557
+ descriptorBase = { textureViews };
558
+
559
+ if ( renderContext.depth ) {
560
+
561
+ const depthTextureData = this.get( renderContext.depthTexture );
562
+ const options = {};
563
+ if ( renderContext.depthTexture.isArrayTexture || renderContext.depthTexture.isCubeTexture ) {
564
+
565
+ options.dimension = GPUTextureViewDimension.TwoD;
566
+ options.arrayLayerCount = 1;
567
+ options.baseArrayLayer = renderContext.activeCubeFace;
568
+
569
+ }
570
+
571
+ descriptorBase.depthStencilView = depthTextureData.texture.createView( options );
572
+
573
+ }
574
+
575
+ descriptors[ cacheKey ] = descriptorBase;
576
+
577
+ renderTargetData.width = renderTarget.width;
578
+ renderTargetData.height = renderTarget.height;
579
+ renderTargetData.samples = renderTarget.samples;
580
+ renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
581
+ renderTargetData.activeCubeFace = renderContext.activeCubeFace;
582
+
583
+ }
584
+
585
+ const descriptor = {
586
+ colorAttachments: []
587
+ };
588
+
589
+ // Apply dynamic properties to cached views
590
+ for ( let i = 0; i < descriptorBase.textureViews.length; i ++ ) {
591
+
592
+ const viewInfo = descriptorBase.textureViews[ i ];
593
+
594
+ let clearValue = { r: 0, g: 0, b: 0, a: 1 };
595
+ if ( i === 0 && colorAttachmentsConfig.clearValue ) {
596
+
597
+ clearValue = colorAttachmentsConfig.clearValue;
598
+
599
+ }
600
+
601
+ descriptor.colorAttachments.push( {
602
+ view: viewInfo.view,
603
+ depthSlice: viewInfo.depthSlice,
604
+ resolveTarget: viewInfo.resolveTarget,
605
+ loadOp: colorAttachmentsConfig.loadOp || GPULoadOp.Load,
606
+ storeOp: colorAttachmentsConfig.storeOp || GPUStoreOp.Store,
607
+ clearValue: clearValue
608
+ } );
609
+
610
+ }
611
+
612
+ if ( descriptorBase.depthStencilView ) {
613
+
614
+ descriptor.depthStencilAttachment = {
615
+ view: descriptorBase.depthStencilView
616
+ };
617
+
618
+ }
619
+
620
+ return descriptor;
621
+
622
+ }
623
+
624
+ /**
625
+ * This method is executed at the beginning of a render call and prepares
626
+ * the WebGPU state for upcoming render calls
627
+ *
628
+ * @param {RenderContext} renderContext - The render context.
629
+ */
630
+ beginRender( renderContext ) {
631
+
632
+ const renderContextData = this.get( renderContext );
633
+
634
+ //
635
+
636
+ const device = this.device;
637
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
638
+
639
+ let occlusionQuerySet;
640
+
641
+ if ( occlusionQueryCount > 0 ) {
642
+
643
+ if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
644
+ if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
645
+
646
+ // Get a reference to the array of objects with queries. The renderContextData property
647
+ // can be changed by another render pass before the buffer.mapAsyc() completes.
648
+ renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
649
+ renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
650
+ renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
651
+
652
+ //
653
+
654
+ occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount, label: `occlusionQuerySet_${ renderContext.id }` } );
655
+
656
+ renderContextData.occlusionQuerySet = occlusionQuerySet;
657
+ renderContextData.occlusionQueryIndex = 0;
658
+ renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
659
+
660
+ renderContextData.lastOcclusionObject = null;
661
+
662
+ }
663
+
664
+ let descriptor;
665
+
666
+ if ( renderContext.textures === null ) {
667
+
668
+ descriptor = this._getDefaultRenderPassDescriptor();
669
+
670
+ } else {
671
+
672
+ descriptor = this._getRenderPassDescriptor( renderContext, { loadOp: GPULoadOp.Load } );
673
+
674
+ }
675
+
676
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ), descriptor );
677
+
678
+ descriptor.occlusionQuerySet = occlusionQuerySet;
679
+
680
+ const depthStencilAttachment = descriptor.depthStencilAttachment;
681
+
682
+ if ( renderContext.textures !== null ) {
683
+
684
+ const colorAttachments = descriptor.colorAttachments;
685
+
686
+ for ( let i = 0; i < colorAttachments.length; i ++ ) {
687
+
688
+ const colorAttachment = colorAttachments[ i ];
689
+
690
+ if ( renderContext.clearColor ) {
691
+
692
+ if ( i === 0 ) {
693
+
694
+ colorAttachment.clearValue = renderContext.clearColorValue;
695
+
696
+ } else {
697
+
698
+ _clearValue.r = 0;
699
+ _clearValue.g = 0;
700
+ _clearValue.b = 0;
701
+ _clearValue.a = 1;
702
+
703
+ colorAttachment.clearValue = _clearValue;
704
+
705
+ }
706
+
707
+ colorAttachment.loadOp = GPULoadOp.Clear;
708
+
709
+ } else {
710
+
711
+ colorAttachment.loadOp = GPULoadOp.Load;
712
+
713
+ }
714
+
715
+ colorAttachment.storeOp = GPUStoreOp.Store;
716
+
717
+ }
718
+
719
+ } else {
720
+
721
+ const colorAttachment = descriptor.colorAttachments[ 0 ];
722
+
723
+ if ( renderContext.clearColor ) {
724
+
725
+ colorAttachment.clearValue = renderContext.clearColorValue;
726
+ colorAttachment.loadOp = GPULoadOp.Clear;
727
+
728
+ } else {
729
+
730
+ colorAttachment.loadOp = GPULoadOp.Load;
731
+
732
+ }
733
+
734
+ colorAttachment.storeOp = GPUStoreOp.Store;
735
+
736
+ }
737
+
738
+ //
739
+
740
+ if ( renderContext.depth ) {
741
+
742
+ if ( renderContext.clearDepth ) {
743
+
744
+ depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
745
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
746
+
747
+ } else {
748
+
749
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
750
+
751
+ }
752
+
753
+ depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
754
+
755
+ }
756
+
757
+ if ( renderContext.stencil ) {
758
+
759
+ if ( renderContext.clearStencil ) {
760
+
761
+ depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
762
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
763
+
764
+ } else {
765
+
766
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
767
+
768
+ }
769
+
770
+ depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
771
+
772
+ }
773
+
774
+ //
775
+
776
+ const encoder = device.createCommandEncoder( { label: 'renderContext_' + renderContext.id } );
777
+
778
+ // shadow arrays - prepare bundle encoders for each camera in an array camera
779
+
780
+ if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
781
+
782
+ const cameras = renderContext.camera.cameras;
783
+
784
+ if ( ! renderContextData.layerDescriptors || renderContextData.layerDescriptors.length !== cameras.length ) {
785
+
786
+ this._createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras );
787
+
788
+ } else {
789
+
790
+ this._updateDepthLayerDescriptors( renderContext, renderContextData, cameras );
791
+
792
+ }
793
+
794
+ // Create bundle encoders for each layer
795
+ renderContextData.bundleEncoders = [];
796
+ renderContextData.bundleSets = [];
797
+
798
+ // Create separate bundle encoders for each camera in the array
799
+ for ( let i = 0; i < cameras.length; i ++ ) {
800
+
801
+ const bundleEncoder = this.pipelineUtils.createBundleEncoder(
802
+ renderContext,
803
+ 'renderBundleArrayCamera_' + i
804
+ );
805
+
806
+ // Initialize state tracking for this bundle
807
+ const bundleSets = {
808
+ attributes: {},
809
+ bindingGroups: [],
810
+ pipeline: null,
811
+ index: null
812
+ };
813
+
814
+ renderContextData.bundleEncoders.push( bundleEncoder );
815
+ renderContextData.bundleSets.push( bundleSets );
816
+
817
+ }
818
+
819
+ // We'll complete the bundles in finishRender
820
+ renderContextData.currentPass = null;
821
+
822
+ } else {
823
+
824
+ const currentPass = encoder.beginRenderPass( descriptor );
825
+ renderContextData.currentPass = currentPass;
826
+
827
+ if ( renderContext.viewport ) {
828
+
829
+ this.updateViewport( renderContext );
830
+
831
+ }
832
+
833
+ if ( renderContext.scissor ) {
834
+
835
+ this.updateScissor( renderContext );
836
+
837
+ }
838
+
839
+ }
840
+
841
+ //
842
+
843
+ renderContextData.descriptor = descriptor;
844
+ renderContextData.encoder = encoder;
845
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
846
+ renderContextData.renderBundles = [];
847
+
848
+ }
849
+
850
+ /**
851
+ * This method creates layer descriptors for each camera in an array camera
852
+ * to prepare for rendering to a depth array texture.
853
+ *
854
+ * @param {RenderContext} renderContext - The render context.
855
+ * @param {Object} renderContextData - The render context data.
856
+ * @param {Object} descriptor - The render pass descriptor.
857
+ * @param {ArrayCamera} cameras - The array camera.
858
+ *
859
+ * @private
860
+ */
861
+ _createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras ) {
862
+
863
+ const depthStencilAttachment = descriptor.depthStencilAttachment;
864
+ renderContextData.layerDescriptors = [];
865
+
866
+ const depthTextureData = this.get( renderContext.depthTexture );
867
+ if ( ! depthTextureData.viewCache ) {
868
+
869
+ depthTextureData.viewCache = [];
870
+
871
+ }
872
+
873
+ for ( let i = 0; i < cameras.length; i ++ ) {
874
+
875
+ const layerDescriptor = {
876
+ ...descriptor,
877
+ colorAttachments: [ {
878
+ ...descriptor.colorAttachments[ 0 ],
879
+ view: descriptor.colorAttachments[ i ].view
880
+ } ]
881
+ };
882
+
883
+ if ( descriptor.depthStencilAttachment ) {
884
+
885
+ const layerIndex = i;
886
+
887
+ if ( ! depthTextureData.viewCache[ layerIndex ] ) {
888
+
889
+ depthTextureData.viewCache[ layerIndex ] = depthTextureData.texture.createView( {
890
+ dimension: GPUTextureViewDimension.TwoD,
891
+ baseArrayLayer: i,
892
+ arrayLayerCount: 1
893
+ } );
894
+
895
+ }
896
+
897
+ layerDescriptor.depthStencilAttachment = {
898
+ view: depthTextureData.viewCache[ layerIndex ],
899
+ depthLoadOp: depthStencilAttachment.depthLoadOp || GPULoadOp.Clear,
900
+ depthStoreOp: depthStencilAttachment.depthStoreOp || GPUStoreOp.Store,
901
+ depthClearValue: depthStencilAttachment.depthClearValue || 1.0
902
+ };
903
+
904
+ if ( renderContext.stencil ) {
905
+
906
+ layerDescriptor.depthStencilAttachment.stencilLoadOp = depthStencilAttachment.stencilLoadOp;
907
+ layerDescriptor.depthStencilAttachment.stencilStoreOp = depthStencilAttachment.stencilStoreOp;
908
+ layerDescriptor.depthStencilAttachment.stencilClearValue = depthStencilAttachment.stencilClearValue;
909
+
910
+ }
911
+
912
+ } else {
913
+
914
+ layerDescriptor.depthStencilAttachment = { ...depthStencilAttachment };
915
+
916
+ }
917
+
918
+ renderContextData.layerDescriptors.push( layerDescriptor );
919
+
920
+ }
921
+
922
+ }
923
+
924
+ /**
925
+ * This method updates the layer descriptors for each camera in an array camera
926
+ * to prepare for rendering to a depth array texture.
927
+ *
928
+ * @param {RenderContext} renderContext - The render context.
929
+ * @param {Object} renderContextData - The render context data.
930
+ * @param {ArrayCamera} cameras - The array camera.
931
+ *
932
+ */
933
+ _updateDepthLayerDescriptors( renderContext, renderContextData, cameras ) {
934
+
935
+ for ( let i = 0; i < cameras.length; i ++ ) {
936
+
937
+ const layerDescriptor = renderContextData.layerDescriptors[ i ];
938
+
939
+ if ( layerDescriptor.depthStencilAttachment ) {
940
+
941
+ const depthAttachment = layerDescriptor.depthStencilAttachment;
942
+
943
+ if ( renderContext.depth ) {
944
+
945
+ if ( renderContext.clearDepth ) {
946
+
947
+ depthAttachment.depthClearValue = renderContext.clearDepthValue;
948
+ depthAttachment.depthLoadOp = GPULoadOp.Clear;
949
+
950
+ } else {
951
+
952
+ depthAttachment.depthLoadOp = GPULoadOp.Load;
953
+
954
+ }
955
+
956
+ }
957
+
958
+ if ( renderContext.stencil ) {
959
+
960
+ if ( renderContext.clearStencil ) {
961
+
962
+ depthAttachment.stencilClearValue = renderContext.clearStencilValue;
963
+ depthAttachment.stencilLoadOp = GPULoadOp.Clear;
964
+
965
+ } else {
966
+
967
+ depthAttachment.stencilLoadOp = GPULoadOp.Load;
968
+
969
+ }
970
+
971
+ }
972
+
973
+ }
974
+
975
+ }
976
+
977
+ }
978
+
979
+ /**
980
+ * This method is executed at the end of a render call and finalizes work
981
+ * after draw calls.
982
+ *
983
+ * @param {RenderContext} renderContext - The render context.
984
+ */
985
+ finishRender( renderContext ) {
986
+
987
+ const renderContextData = this.get( renderContext );
988
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
989
+
990
+ if ( renderContextData.renderBundles.length > 0 ) {
991
+
992
+ renderContextData.currentPass.executeBundles( renderContextData.renderBundles );
993
+
994
+ }
995
+
996
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
997
+
998
+ renderContextData.currentPass.endOcclusionQuery();
999
+
1000
+ }
1001
+
1002
+ // shadow arrays - Execute bundles for each layer
1003
+
1004
+ const encoder = renderContextData.encoder;
1005
+
1006
+ if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
1007
+
1008
+ const bundles = [];
1009
+
1010
+ for ( let i = 0; i < renderContextData.bundleEncoders.length; i ++ ) {
1011
+
1012
+ const bundleEncoder = renderContextData.bundleEncoders[ i ];
1013
+ bundles.push( bundleEncoder.finish() );
1014
+
1015
+ }
1016
+
1017
+ for ( let i = 0; i < renderContextData.layerDescriptors.length; i ++ ) {
1018
+
1019
+ if ( i < bundles.length ) {
1020
+
1021
+ const layerDescriptor = renderContextData.layerDescriptors[ i ];
1022
+ const renderPass = encoder.beginRenderPass( layerDescriptor );
1023
+
1024
+ if ( renderContext.viewport ) {
1025
+
1026
+ const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
1027
+ renderPass.setViewport( x, y, width, height, minDepth, maxDepth );
1028
+
1029
+ }
1030
+
1031
+ if ( renderContext.scissor ) {
1032
+
1033
+ const { x, y, width, height } = renderContext.scissorValue;
1034
+ renderPass.setScissorRect( x, y, width, height );
1035
+
1036
+ }
1037
+
1038
+ renderPass.executeBundles( [ bundles[ i ] ] );
1039
+
1040
+ renderPass.end();
1041
+
1042
+ }
1043
+
1044
+ }
1045
+
1046
+ } else if ( renderContextData.currentPass ) {
1047
+
1048
+ renderContextData.currentPass.end();
1049
+
1050
+ }
1051
+
1052
+ if ( occlusionQueryCount > 0 ) {
1053
+
1054
+ const bufferSize = occlusionQueryCount * 8; // 8 byte entries for query results
1055
+
1056
+ //
1057
+
1058
+ let queryResolveBuffer = this.occludedResolveCache.get( bufferSize );
1059
+
1060
+ if ( queryResolveBuffer === undefined ) {
1061
+
1062
+ queryResolveBuffer = this.device.createBuffer(
1063
+ {
1064
+ size: bufferSize,
1065
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
1066
+ }
1067
+ );
1068
+
1069
+ this.occludedResolveCache.set( bufferSize, queryResolveBuffer );
1070
+
1071
+ }
1072
+
1073
+ //
1074
+
1075
+ const readBuffer = this.device.createBuffer(
1076
+ {
1077
+ size: bufferSize,
1078
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
1079
+ }
1080
+ );
1081
+
1082
+ // two buffers required here - WebGPU doesn't allow usage of QUERY_RESOLVE & MAP_READ to be combined
1083
+ renderContextData.encoder.resolveQuerySet( renderContextData.occlusionQuerySet, 0, occlusionQueryCount, queryResolveBuffer, 0 );
1084
+ renderContextData.encoder.copyBufferToBuffer( queryResolveBuffer, 0, readBuffer, 0, bufferSize );
1085
+
1086
+ renderContextData.occlusionQueryBuffer = readBuffer;
1087
+
1088
+ //
1089
+
1090
+ this.resolveOccludedAsync( renderContext );
1091
+
1092
+ }
1093
+
1094
+ this.device.queue.submit( [ renderContextData.encoder.finish() ] );
1095
+
1096
+
1097
+ //
1098
+
1099
+ if ( renderContext.textures !== null ) {
1100
+
1101
+ const textures = renderContext.textures;
1102
+
1103
+ for ( let i = 0; i < textures.length; i ++ ) {
1104
+
1105
+ const texture = textures[ i ];
1106
+
1107
+ if ( texture.generateMipmaps === true ) {
1108
+
1109
+ this.textureUtils.generateMipmaps( texture );
1110
+
1111
+ }
1112
+
1113
+ }
1114
+
1115
+ }
1116
+
1117
+ }
1118
+
1119
+ /**
1120
+ * Returns `true` if the given 3D object is fully occluded by other
1121
+ * 3D objects in the scene.
1122
+ *
1123
+ * @param {RenderContext} renderContext - The render context.
1124
+ * @param {Object3D} object - The 3D object to test.
1125
+ * @return {boolean} Whether the 3D object is fully occluded or not.
1126
+ */
1127
+ isOccluded( renderContext, object ) {
1128
+
1129
+ const renderContextData = this.get( renderContext );
1130
+
1131
+ return renderContextData.occluded && renderContextData.occluded.has( object );
1132
+
1133
+ }
1134
+
1135
+ /**
1136
+ * This method processes the result of occlusion queries and writes it
1137
+ * into render context data.
1138
+ *
1139
+ * @async
1140
+ * @param {RenderContext} renderContext - The render context.
1141
+ * @return {Promise} A Promise that resolves when the occlusion query results have been processed.
1142
+ */
1143
+ async resolveOccludedAsync( renderContext ) {
1144
+
1145
+ const renderContextData = this.get( renderContext );
1146
+
1147
+ // handle occlusion query results
1148
+
1149
+ const { currentOcclusionQueryBuffer, currentOcclusionQueryObjects } = renderContextData;
1150
+
1151
+ if ( currentOcclusionQueryBuffer && currentOcclusionQueryObjects ) {
1152
+
1153
+ const occluded = new WeakSet();
1154
+
1155
+ renderContextData.currentOcclusionQueryObjects = null;
1156
+ renderContextData.currentOcclusionQueryBuffer = null;
1157
+
1158
+ await currentOcclusionQueryBuffer.mapAsync( GPUMapMode.READ );
1159
+
1160
+ const buffer = currentOcclusionQueryBuffer.getMappedRange();
1161
+ const results = new BigUint64Array( buffer );
1162
+
1163
+ for ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) {
1164
+
1165
+ if ( results[ i ] === BigInt( 0 ) ) {
1166
+
1167
+ occluded.add( currentOcclusionQueryObjects[ i ] );
1168
+
1169
+ }
1170
+
1171
+ }
1172
+
1173
+ currentOcclusionQueryBuffer.destroy();
1174
+
1175
+ renderContextData.occluded = occluded;
1176
+
1177
+ }
1178
+
1179
+ }
1180
+
1181
+ /**
1182
+ * Updates the viewport with the values from the given render context.
1183
+ *
1184
+ * @param {RenderContext} renderContext - The render context.
1185
+ */
1186
+ updateViewport( renderContext ) {
1187
+
1188
+ const { currentPass } = this.get( renderContext );
1189
+ const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
1190
+
1191
+ currentPass.setViewport( x, y, width, height, minDepth, maxDepth );
1192
+
1193
+ }
1194
+
1195
+ /**
1196
+ * Updates the scissor with the values from the given render context.
1197
+ *
1198
+ * @param {RenderContext} renderContext - The render context.
1199
+ */
1200
+ updateScissor( renderContext ) {
1201
+
1202
+ const { currentPass } = this.get( renderContext );
1203
+ const { x, y, width, height } = renderContext.scissorValue;
1204
+
1205
+ currentPass.setScissorRect( x, y, width, height );
1206
+
1207
+ }
1208
+
1209
+ /**
1210
+ * Returns the clear color and alpha into a single
1211
+ * color object.
1212
+ *
1213
+ * @return {Color4} The clear color.
1214
+ */
1215
+ getClearColor() {
1216
+
1217
+ const clearColor = super.getClearColor();
1218
+
1219
+ // only premultiply alpha when alphaMode is "premultiplied"
1220
+
1221
+ if ( this.renderer.alpha === true ) {
1222
+
1223
+ clearColor.r *= clearColor.a;
1224
+ clearColor.g *= clearColor.a;
1225
+ clearColor.b *= clearColor.a;
1226
+
1227
+ }
1228
+
1229
+ return clearColor;
1230
+
1231
+ }
1232
+
1233
+ /**
1234
+ * Performs a clear operation.
1235
+ *
1236
+ * @param {boolean} color - Whether the color buffer should be cleared or not.
1237
+ * @param {boolean} depth - Whether the depth buffer should be cleared or not.
1238
+ * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
1239
+ * @param {?RenderContext} [renderTargetContext=null] - The render context of the current set render target.
1240
+ */
1241
+ clear( color, depth, stencil, renderTargetContext = null ) {
1242
+
1243
+ const device = this.device;
1244
+ const renderer = this.renderer;
1245
+
1246
+ let colorAttachments = [];
1247
+ let depthStencilAttachment;
1248
+
1249
+ let supportsDepth;
1250
+ let supportsStencil;
1251
+
1252
+ if ( color ) {
1253
+
1254
+ const clearColor = this.getClearColor();
1255
+
1256
+ _clearValue.r = clearColor.r;
1257
+ _clearValue.g = clearColor.g;
1258
+ _clearValue.b = clearColor.b;
1259
+ _clearValue.a = clearColor.a;
1260
+
1261
+ }
1262
+
1263
+ if ( renderTargetContext === null ) {
1264
+
1265
+ supportsDepth = renderer.depth;
1266
+ supportsStencil = renderer.stencil;
1267
+
1268
+ const descriptor = this._getDefaultRenderPassDescriptor();
1269
+
1270
+ if ( color ) {
1271
+
1272
+ colorAttachments = descriptor.colorAttachments;
1273
+
1274
+ const colorAttachment = colorAttachments[ 0 ];
1275
+
1276
+ colorAttachment.clearValue = _clearValue;
1277
+ colorAttachment.loadOp = GPULoadOp.Clear;
1278
+ colorAttachment.storeOp = GPUStoreOp.Store;
1279
+
1280
+ }
1281
+
1282
+ if ( supportsDepth || supportsStencil ) {
1283
+
1284
+ depthStencilAttachment = descriptor.depthStencilAttachment;
1285
+
1286
+ }
1287
+
1288
+ } else {
1289
+
1290
+ supportsDepth = renderTargetContext.depth;
1291
+ supportsStencil = renderTargetContext.stencil;
1292
+
1293
+ const clearConfig = {
1294
+ loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
1295
+ clearValue: color ? _clearValue : undefined
1296
+ };
1297
+
1298
+ if ( supportsDepth ) {
1299
+
1300
+ clearConfig.depthLoadOp = depth ? GPULoadOp.Clear : GPULoadOp.Load;
1301
+ clearConfig.depthClearValue = depth ? renderer.getClearDepth() : undefined;
1302
+ clearConfig.depthStoreOp = GPUStoreOp.Store;
1303
+
1304
+ }
1305
+
1306
+ if ( supportsStencil ) {
1307
+
1308
+ clearConfig.stencilLoadOp = stencil ? GPULoadOp.Clear : GPULoadOp.Load;
1309
+ clearConfig.stencilClearValue = stencil ? renderer.getClearStencil() : undefined;
1310
+ clearConfig.stencilStoreOp = GPUStoreOp.Store;
1311
+
1312
+ }
1313
+
1314
+ const descriptor = this._getRenderPassDescriptor( renderTargetContext, clearConfig );
1315
+
1316
+ colorAttachments = descriptor.colorAttachments;
1317
+ depthStencilAttachment = descriptor.depthStencilAttachment;
1318
+
1319
+ }
1320
+
1321
+ if ( supportsDepth && depthStencilAttachment ) {
1322
+
1323
+ if ( depth ) {
1324
+
1325
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
1326
+ depthStencilAttachment.depthClearValue = renderer.getClearDepth();
1327
+ depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
1328
+
1329
+ } else {
1330
+
1331
+ depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
1332
+ depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
1333
+
1334
+ }
1335
+
1336
+ }
1337
+
1338
+ //
1339
+
1340
+ if ( supportsStencil && depthStencilAttachment ) {
1341
+
1342
+ if ( stencil ) {
1343
+
1344
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
1345
+ depthStencilAttachment.stencilClearValue = renderer.getClearStencil();
1346
+ depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
1347
+
1348
+ } else {
1349
+
1350
+ depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
1351
+ depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
1352
+
1353
+ }
1354
+
1355
+ }
1356
+
1357
+ //
1358
+
1359
+ const encoder = device.createCommandEncoder( { label: 'clear' } );
1360
+ const currentPass = encoder.beginRenderPass( {
1361
+ colorAttachments,
1362
+ depthStencilAttachment
1363
+ } );
1364
+
1365
+ currentPass.end();
1366
+
1367
+ device.queue.submit( [ encoder.finish() ] );
1368
+
1369
+ }
1370
+
1371
+ // compute
1372
+
1373
+ /**
1374
+ * This method is executed at the beginning of a compute call and
1375
+ * prepares the state for upcoming compute tasks.
1376
+ *
1377
+ * @param {Node|Array<Node>} computeGroup - The compute node(s).
1378
+ */
1379
+ beginCompute( computeGroup ) {
1380
+
1381
+ const groupGPU = this.get( computeGroup );
1382
+
1383
+ //
1384
+
1385
+ const descriptor = {
1386
+ label: 'computeGroup_' + computeGroup.id
1387
+ };
1388
+
1389
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );
1390
+
1391
+ groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );
1392
+
1393
+ groupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass( descriptor );
1394
+
1395
+ }
1396
+
1397
+ /**
1398
+ * Executes a compute command for the given compute node.
1399
+ *
1400
+ * @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.
1401
+ * @param {Node} computeNode - The compute node.
1402
+ * @param {Array<BindGroup>} bindings - The bindings.
1403
+ * @param {ComputePipeline} pipeline - The compute pipeline.
1404
+ * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]
1405
+ * - A single number representing count, or
1406
+ * - An array [x, y, z] representing dispatch size, or
1407
+ * - A IndirectStorageBufferAttribute for indirect dispatch size.
1408
+ */
1409
+ compute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {
1410
+
1411
+ const computeNodeData = this.get( computeNode );
1412
+ const { passEncoderGPU } = this.get( computeGroup );
1413
+
1414
+ // pipeline
1415
+
1416
+ const pipelineGPU = this.get( pipeline ).pipeline;
1417
+
1418
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1419
+
1420
+ // bind groups
1421
+
1422
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1423
+
1424
+ const bindGroup = bindings[ i ];
1425
+ const bindingsData = this.get( bindGroup );
1426
+
1427
+ passEncoderGPU.setBindGroup( i, bindingsData.group );
1428
+
1429
+ }
1430
+
1431
+ if ( dispatchSize === null ) {
1432
+
1433
+ dispatchSize = computeNode.dispatchSize || computeNode.count;
1434
+
1435
+ }
1436
+
1437
+ // When the dispatchSize is set with a StorageBuffer from the GPU.
1438
+
1439
+ if ( dispatchSize && dispatchSize.isIndirectStorageBufferAttribute ) {
1440
+
1441
+ const dispatchBuffer = this.get( dispatchSize ).buffer;
1442
+
1443
+ passEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );
1444
+
1445
+ return;
1446
+
1447
+ }
1448
+
1449
+ if ( typeof dispatchSize === 'number' ) {
1450
+
1451
+ // If a single number is given, we calculate the dispatch size based on the workgroup size
1452
+
1453
+ const count = dispatchSize;
1454
+
1455
+ if ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {
1456
+
1457
+ // cache dispatch size to avoid recalculating it every time
1458
+
1459
+ computeNodeData.dispatchSize = [ 0, 1, 1 ];
1460
+ computeNodeData.count = count;
1461
+
1462
+ const workgroupSize = computeNode.workgroupSize;
1463
+
1464
+ let size = workgroupSize[ 0 ];
1465
+
1466
+ for ( let i = 1; i < workgroupSize.length; i ++ )
1467
+ size *= workgroupSize[ i ];
1468
+
1469
+ const dispatchCount = Math.ceil( count / size );
1470
+
1471
+ //
1472
+
1473
+ const maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension;
1474
+
1475
+ dispatchSize = [ dispatchCount, 1, 1 ];
1476
+
1477
+ if ( dispatchCount > maxComputeWorkgroupsPerDimension ) {
1478
+
1479
+ dispatchSize[ 0 ] = Math.min( dispatchCount, maxComputeWorkgroupsPerDimension );
1480
+ dispatchSize[ 1 ] = Math.ceil( dispatchCount / maxComputeWorkgroupsPerDimension );
1481
+
1482
+ }
1483
+
1484
+ computeNodeData.dispatchSize = dispatchSize;
1485
+
1486
+ }
1487
+
1488
+ dispatchSize = computeNodeData.dispatchSize;
1489
+
1490
+ }
1491
+
1492
+ //
1493
+
1494
+ passEncoderGPU.dispatchWorkgroups(
1495
+ dispatchSize[ 0 ],
1496
+ dispatchSize[ 1 ] || 1,
1497
+ dispatchSize[ 2 ] || 1
1498
+ );
1499
+
1500
+ }
1501
+
1502
+ /**
1503
+ * This method is executed at the end of a compute call and
1504
+ * finalizes work after compute tasks.
1505
+ *
1506
+ * @param {Node|Array<Node>} computeGroup - The compute node(s).
1507
+ */
1508
+ finishCompute( computeGroup ) {
1509
+
1510
+ const groupData = this.get( computeGroup );
1511
+
1512
+ groupData.passEncoderGPU.end();
1513
+
1514
+ this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] );
1515
+
1516
+ }
1517
+
1518
+ /**
1519
+ * Internal draw function that performs the draw with the given pass encoder.
1520
+ *
1521
+ * @private
1522
+ * @param {RenderObject} renderObject - The render object.
1523
+ * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
1524
+ * @param {Object} renderContextData - The render context data object, holding current pass state and occlusion query tracking.
1525
+ * @param {GPURenderPipeline} pipelineGPU - The GPU render pipeline.
1526
+ * @param {Array<BindGroup>} bindings - The bind groups.
1527
+ * @param {Array<BufferAttribute>} vertexBuffers - The vertex buffers.
1528
+ * @param {{vertexCount: number, firstVertex: number, instanceCount: number, firstInstance: number}} drawParams - The draw parameters.
1529
+ * @param {GPURenderPassEncoder|GPURenderBundleEncoder} passEncoderGPU - The GPU pass encoder used for recording draw commands.
1530
+ * @param {Object} currentSets - Tracking object for currently set pipeline, attributes, bind groups, and index state.
1531
+ */
1532
+ _draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, passEncoderGPU, currentSets ) {
1533
+
1534
+ const { object, material, context } = renderObject;
1535
+
1536
+ const index = renderObject.getIndex();
1537
+ const hasIndex = ( index !== null );
1538
+
1539
+ // pipeline
1540
+ this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
1541
+ currentSets.pipeline = pipelineGPU;
1542
+
1543
+ // bind groups
1544
+ const currentBindingGroups = currentSets.bindingGroups;
1545
+ for ( let i = 0, l = bindings.length; i < l; i ++ ) {
1546
+
1547
+ const bindGroup = bindings[ i ];
1548
+ const bindingsData = this.get( bindGroup );
1549
+ if ( currentBindingGroups[ i ] !== bindGroup.id ) {
1550
+
1551
+ passEncoderGPU.setBindGroup( i, bindingsData.group );
1552
+ currentBindingGroups[ i ] = bindGroup.id;
1553
+
1554
+ }
1555
+
1556
+ }
1557
+
1558
+ // attributes
1559
+
1560
+ // index
1561
+
1562
+ if ( hasIndex === true ) {
1563
+
1564
+ if ( currentSets.index !== index ) {
1565
+
1566
+ const buffer = this.get( index ).buffer;
1567
+ const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
1568
+
1569
+ passEncoderGPU.setIndexBuffer( buffer, indexFormat );
1570
+
1571
+ currentSets.index = index;
1572
+
1573
+ }
1574
+
1575
+ }
1576
+
1577
+ for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
1578
+
1579
+ const vertexBuffer = vertexBuffers[ i ];
1580
+
1581
+ if ( currentSets.attributes[ i ] !== vertexBuffer ) {
1582
+
1583
+ const buffer = this.get( vertexBuffer ).buffer;
1584
+ passEncoderGPU.setVertexBuffer( i, buffer );
1585
+
1586
+ currentSets.attributes[ i ] = vertexBuffer;
1587
+
1588
+ }
1589
+
1590
+ }
1591
+ // stencil
1592
+
1593
+ if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
1594
+
1595
+ passEncoderGPU.setStencilReference( material.stencilRef );
1596
+ renderContextData.currentStencilRef = material.stencilRef;
1597
+
1598
+ }
1599
+
1600
+ if ( object.isBatchedMesh === true ) {
1601
+
1602
+ const starts = object._multiDrawStarts;
1603
+ const counts = object._multiDrawCounts;
1604
+ const drawCount = object._multiDrawCount;
1605
+
1606
+ let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1;
1607
+
1608
+ if ( material.wireframe ) {
1609
+
1610
+ bytesPerElement = object.geometry.attributes.position.count > 65535 ? 4 : 2;
1611
+
1612
+ }
1613
+
1614
+ for ( let i = 0; i < drawCount; i ++ ) {
1615
+
1616
+ if ( hasIndex === true ) {
1617
+
1618
+ passEncoderGPU.drawIndexed( counts[ i ], 1, starts[ i ] / bytesPerElement, 0, i );
1619
+
1620
+ } else {
1621
+
1622
+ passEncoderGPU.draw( counts[ i ], 1, starts[ i ], i );
1623
+
1624
+ }
1625
+
1626
+ info.update( object, counts[ i ], 1 );
1627
+
1628
+ }
1629
+
1630
+ } else if ( hasIndex === true ) {
1631
+
1632
+ const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
1633
+
1634
+ const indirect = renderObject.getIndirect();
1635
+
1636
+ if ( indirect !== null ) {
1637
+
1638
+ const buffer = this.get( indirect ).buffer;
1639
+ const indirectOffset = renderObject.getIndirectOffset();
1640
+ const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
1641
+
1642
+ for ( let i = 0; i < indirectOffsets.length; i ++ ) {
1643
+
1644
+ passEncoderGPU.drawIndexedIndirect( buffer, indirectOffsets[ i ] );
1645
+
1646
+ }
1647
+
1648
+ } else {
1649
+
1650
+ passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
1651
+
1652
+ }
1653
+
1654
+ info.update( object, indexCount, instanceCount );
1655
+
1656
+ } else {
1657
+
1658
+ const { vertexCount, instanceCount, firstVertex } = drawParams;
1659
+
1660
+ const indirect = renderObject.getIndirect();
1661
+
1662
+ if ( indirect !== null ) {
1663
+
1664
+ const buffer = this.get( indirect ).buffer;
1665
+ const indirectOffset = renderObject.getIndirectOffset();
1666
+ const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
1667
+
1668
+ for ( let i = 0; i < indirectOffsets.length; i ++ ) {
1669
+
1670
+ passEncoderGPU.drawIndirect( buffer, indirectOffsets[ i ] );
1671
+
1672
+ }
1673
+
1674
+
1675
+ } else {
1676
+
1677
+ passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
1678
+
1679
+ }
1680
+
1681
+ info.update( object, vertexCount, instanceCount );
1682
+
1683
+ }
1684
+
1685
+ }
1686
+
1687
+ // render object
1688
+
1689
+ /**
1690
+ * Executes a draw command for the given render object.
1691
+ *
1692
+ * @param {RenderObject} renderObject - The render object to draw.
1693
+ * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
1694
+ */
1695
+ draw( renderObject, info ) {
1696
+
1697
+ const { object, context, pipeline } = renderObject;
1698
+ const renderContextData = this.get( context );
1699
+ const pipelineData = this.get( pipeline );
1700
+ const pipelineGPU = pipelineData.pipeline;
1701
+
1702
+ // Skip if pipeline has error
1703
+ if ( pipelineData.error === true ) return;
1704
+
1705
+ const drawParams = renderObject.getDrawParameters();
1706
+ if ( drawParams === null ) return;
1707
+
1708
+ const bindings = renderObject.getBindings();
1709
+
1710
+ // vertex buffers
1711
+
1712
+ const vertexBuffers = renderObject.getVertexBuffers();
1713
+
1714
+ if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
1715
+
1716
+ const cameraData = this.get( renderObject.camera );
1717
+ const cameras = renderObject.camera.cameras;
1718
+ const cameraIndex = renderObject.getBindingGroup( 'cameraIndex' );
1719
+
1720
+ if ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) {
1721
+
1722
+ const bindingsData = this.get( cameraIndex );
1723
+ const indexesGPU = [];
1724
+
1725
+ const data = new Uint32Array( [ 0, 0, 0, 0 ] );
1726
+
1727
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1728
+
1729
+ data[ 0 ] = i;
1730
+
1731
+ const { layoutGPU } = bindingsData.layout;
1732
+
1733
+ const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, layoutGPU );
1734
+
1735
+ indexesGPU.push( bindGroupIndex );
1736
+
1737
+ }
1738
+
1739
+ cameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this
1740
+
1741
+ }
1742
+
1743
+ const pixelRatio = this.renderer.getPixelRatio();
1744
+
1745
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1746
+
1747
+ const subCamera = cameras[ i ];
1748
+
1749
+ if ( object.layers.test( subCamera.layers ) ) {
1750
+
1751
+ const vp = subCamera.viewport;
1752
+
1753
+ let pass = renderContextData.currentPass;
1754
+ let sets = renderContextData.currentSets;
1755
+ if ( renderContextData.bundleEncoders ) {
1756
+
1757
+ const bundleEncoder = renderContextData.bundleEncoders[ i ];
1758
+ const bundleSets = renderContextData.bundleSets[ i ];
1759
+ pass = bundleEncoder;
1760
+ sets = bundleSets;
1761
+
1762
+ }
1763
+
1764
+ if ( vp ) {
1765
+
1766
+ pass.setViewport(
1767
+ Math.floor( vp.x * pixelRatio ),
1768
+ Math.floor( vp.y * pixelRatio ),
1769
+ Math.floor( vp.width * pixelRatio ),
1770
+ Math.floor( vp.height * pixelRatio ),
1771
+ context.viewportValue.minDepth,
1772
+ context.viewportValue.maxDepth
1773
+ );
1774
+
1775
+ }
1776
+
1777
+ // Set camera index binding for this layer
1778
+ if ( cameraIndex && cameraData.indexesGPU ) {
1779
+
1780
+ const indexPos = bindings.indexOf( cameraIndex );
1781
+ pass.setBindGroup( indexPos, cameraData.indexesGPU[ i ] );
1782
+ sets.bindingGroups[ indexPos ] = cameraIndex.id;
1783
+
1784
+ }
1785
+
1786
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, pass, sets );
1787
+
1788
+ }
1789
+
1790
+ }
1791
+
1792
+ } else {
1793
+
1794
+ // Regular single camera rendering
1795
+ if ( renderContextData.currentPass ) {
1796
+
1797
+ // Handle occlusion queries
1798
+ if ( renderContextData.occlusionQuerySet !== undefined ) {
1799
+
1800
+ const lastObject = renderContextData.lastOcclusionObject;
1801
+ if ( lastObject !== object ) {
1802
+
1803
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
1804
+
1805
+ renderContextData.currentPass.endOcclusionQuery();
1806
+ renderContextData.occlusionQueryIndex ++;
1807
+
1808
+ }
1809
+
1810
+ if ( object.occlusionTest === true ) {
1811
+
1812
+ renderContextData.currentPass.beginOcclusionQuery( renderContextData.occlusionQueryIndex );
1813
+ renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
1814
+
1815
+ }
1816
+
1817
+ renderContextData.lastOcclusionObject = object;
1818
+
1819
+ }
1820
+
1821
+ }
1822
+
1823
+ this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, renderContextData.currentPass, renderContextData.currentSets );
1824
+
1825
+ }
1826
+
1827
+ }
1828
+
1829
+ }
1830
+
1831
+ // cache key
1832
+
1833
+ /**
1834
+ * Returns `true` if the render pipeline requires an update.
1835
+ *
1836
+ * @param {RenderObject} renderObject - The render object.
1837
+ * @return {boolean} Whether the render pipeline requires an update or not.
1838
+ */
1839
+ needsRenderUpdate( renderObject ) {
1840
+
1841
+ const data = this.get( renderObject );
1842
+
1843
+ const { object, material } = renderObject;
1844
+
1845
+ const utils = this.utils;
1846
+
1847
+ const sampleCount = utils.getSampleCountRenderContext( renderObject.context );
1848
+ const colorSpace = utils.getCurrentColorSpace( renderObject.context );
1849
+ const colorFormat = utils.getCurrentColorFormat( renderObject.context );
1850
+ const depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context );
1851
+ const primitiveTopology = utils.getPrimitiveTopology( object, material );
1852
+
1853
+ let needsUpdate = false;
1854
+
1855
+ if ( data.material !== material || data.materialVersion !== material.version ||
1856
+ data.transparent !== material.transparent || data.blending !== material.blending || data.premultipliedAlpha !== material.premultipliedAlpha ||
1857
+ data.blendSrc !== material.blendSrc || data.blendDst !== material.blendDst || data.blendEquation !== material.blendEquation ||
1858
+ data.blendSrcAlpha !== material.blendSrcAlpha || data.blendDstAlpha !== material.blendDstAlpha || data.blendEquationAlpha !== material.blendEquationAlpha ||
1859
+ data.colorWrite !== material.colorWrite || data.depthWrite !== material.depthWrite || data.depthTest !== material.depthTest || data.depthFunc !== material.depthFunc ||
1860
+ data.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc ||
1861
+ data.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass ||
1862
+ data.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask ||
1863
+ data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage ||
1864
+ data.sampleCount !== sampleCount || data.colorSpace !== colorSpace ||
1865
+ data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat ||
1866
+ data.primitiveTopology !== primitiveTopology ||
1867
+ data.clippingContextCacheKey !== renderObject.clippingContextCacheKey
1868
+ ) {
1869
+
1870
+ data.material = material; data.materialVersion = material.version;
1871
+ data.transparent = material.transparent; data.blending = material.blending; data.premultipliedAlpha = material.premultipliedAlpha;
1872
+ data.blendSrc = material.blendSrc; data.blendDst = material.blendDst; data.blendEquation = material.blendEquation;
1873
+ data.blendSrcAlpha = material.blendSrcAlpha; data.blendDstAlpha = material.blendDstAlpha; data.blendEquationAlpha = material.blendEquationAlpha;
1874
+ data.colorWrite = material.colorWrite;
1875
+ data.depthWrite = material.depthWrite; data.depthTest = material.depthTest; data.depthFunc = material.depthFunc;
1876
+ data.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc;
1877
+ data.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass;
1878
+ data.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask;
1879
+ data.side = material.side; data.alphaToCoverage = material.alphaToCoverage;
1880
+ data.sampleCount = sampleCount;
1881
+ data.colorSpace = colorSpace;
1882
+ data.colorFormat = colorFormat;
1883
+ data.depthStencilFormat = depthStencilFormat;
1884
+ data.primitiveTopology = primitiveTopology;
1885
+ data.clippingContextCacheKey = renderObject.clippingContextCacheKey;
1886
+
1887
+ needsUpdate = true;
1888
+
1889
+ }
1890
+
1891
+ return needsUpdate;
1892
+
1893
+ }
1894
+
1895
+ /**
1896
+ * Returns a cache key that is used to identify render pipelines.
1897
+ *
1898
+ * @param {RenderObject} renderObject - The render object.
1899
+ * @return {string} The cache key.
1900
+ */
1901
+ getRenderCacheKey( renderObject ) {
1902
+
1903
+ const { object, material } = renderObject;
1904
+
1905
+ const utils = this.utils;
1906
+ const renderContext = renderObject.context;
1907
+
1908
+ // meshes with negative scale have a different frontFace render pipeline
1909
+ // descriptor value so the following must be honored in the cache key
1910
+
1911
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
1912
+
1913
+ return [
1914
+ material.transparent, material.blending, material.premultipliedAlpha,
1915
+ material.blendSrc, material.blendDst, material.blendEquation,
1916
+ material.blendSrcAlpha, material.blendDstAlpha, material.blendEquationAlpha,
1917
+ material.colorWrite,
1918
+ material.depthWrite, material.depthTest, material.depthFunc,
1919
+ material.stencilWrite, material.stencilFunc,
1920
+ material.stencilFail, material.stencilZFail, material.stencilZPass,
1921
+ material.stencilFuncMask, material.stencilWriteMask,
1922
+ material.side,
1923
+ frontFaceCW,
1924
+ utils.getSampleCountRenderContext( renderContext ),
1925
+ utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
1926
+ utils.getPrimitiveTopology( object, material ),
1927
+ renderObject.getGeometryCacheKey(),
1928
+ renderObject.clippingContextCacheKey
1929
+ ].join();
1930
+
1931
+ }
1932
+
1933
+ // textures
1934
+
1935
+ /**
1936
+ * Updates a GPU sampler for the given texture.
1937
+ *
1938
+ * @param {Texture} texture - The texture to update the sampler for.
1939
+ * @return {string} The current sampler key.
1940
+ */
1941
+ updateSampler( texture ) {
1942
+
1943
+ return this.textureUtils.updateSampler( texture );
1944
+
1945
+ }
1946
+
1947
+ /**
1948
+ * Creates a default texture for the given texture that can be used
1949
+ * as a placeholder until the actual texture is ready for usage.
1950
+ *
1951
+ * @param {Texture} texture - The texture to create a default texture for.
1952
+ * @return {boolean} Whether the sampler has been updated or not.
1953
+ */
1954
+ createDefaultTexture( texture ) {
1955
+
1956
+ return this.textureUtils.createDefaultTexture( texture );
1957
+
1958
+ }
1959
+
1960
+ /**
1961
+ * Defines a texture on the GPU for the given texture object.
1962
+ *
1963
+ * @param {Texture} texture - The texture.
1964
+ * @param {Object} [options={}] - Optional configuration parameter.
1965
+ */
1966
+ createTexture( texture, options ) {
1967
+
1968
+ this.textureUtils.createTexture( texture, options );
1969
+
1970
+ }
1971
+
1972
+ /**
1973
+ * Uploads the updated texture data to the GPU.
1974
+ *
1975
+ * @param {Texture} texture - The texture.
1976
+ * @param {Object} [options={}] - Optional configuration parameter.
1977
+ */
1978
+ updateTexture( texture, options ) {
1979
+
1980
+ this.textureUtils.updateTexture( texture, options );
1981
+
1982
+ }
1983
+
1984
+ /**
1985
+ * Generates mipmaps for the given texture.
1986
+ *
1987
+ * @param {Texture} texture - The texture.
1988
+ */
1989
+ generateMipmaps( texture ) {
1990
+
1991
+ this.textureUtils.generateMipmaps( texture );
1992
+
1993
+ }
1994
+
1995
+ /**
1996
+ * Destroys the GPU data for the given texture object.
1997
+ *
1998
+ * @param {Texture} texture - The texture.
1999
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
2000
+ */
2001
+ destroyTexture( texture, isDefaultTexture = false ) {
2002
+
2003
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
2004
+
2005
+ }
2006
+
2007
+ /**
2008
+ * Returns texture data as a typed array.
2009
+ *
2010
+ * @async
2011
+ * @param {Texture} texture - The texture to copy.
2012
+ * @param {number} x - The x coordinate of the copy origin.
2013
+ * @param {number} y - The y coordinate of the copy origin.
2014
+ * @param {number} width - The width of the copy.
2015
+ * @param {number} height - The height of the copy.
2016
+ * @param {number} faceIndex - The face index.
2017
+ * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.
2018
+ */
2019
+ async copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
2020
+
2021
+ return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );
2022
+
2023
+ }
2024
+
2025
+ /**
2026
+ * Inits a time stamp query for the given render context.
2027
+ *
2028
+ * @param {string} type - The type of the timestamp query (e.g. 'render', 'compute').
2029
+ * @param {number} uid - Unique id for the context (e.g. render context id).
2030
+ * @param {Object} descriptor - The query descriptor.
2031
+ */
2032
+ initTimestampQuery( type, uid, descriptor ) {
2033
+
2034
+ if ( ! this.trackTimestamp ) return;
2035
+
2036
+ if ( ! this.timestampQueryPool[ type ] ) {
2037
+
2038
+ // TODO: Variable maxQueries?
2039
+ this.timestampQueryPool[ type ] = new WebGPUTimestampQueryPool( this.device, type, 2048 );
2040
+
2041
+ }
2042
+
2043
+ const timestampQueryPool = this.timestampQueryPool[ type ];
2044
+
2045
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
2046
+
2047
+ descriptor.timestampWrites = {
2048
+ querySet: timestampQueryPool.querySet,
2049
+ beginningOfPassWriteIndex: baseOffset,
2050
+ endOfPassWriteIndex: baseOffset + 1,
2051
+ };
2052
+
2053
+ }
2054
+
2055
+
2056
+ // node builder
2057
+
2058
+ /**
2059
+ * Returns a node builder for the given render object.
2060
+ *
2061
+ * @param {RenderObject} object - The render object.
2062
+ * @param {Renderer} renderer - The renderer.
2063
+ * @return {WGSLNodeBuilder} The node builder.
2064
+ */
2065
+ createNodeBuilder( object, renderer ) {
2066
+
2067
+ return new WGSLNodeBuilder( object, renderer );
2068
+
2069
+ }
2070
+
2071
+ // program
2072
+
2073
+ /**
2074
+ * Creates a shader program from the given programmable stage.
2075
+ *
2076
+ * @param {ProgrammableStage} program - The programmable stage.
2077
+ */
2078
+ createProgram( program ) {
2079
+
2080
+ const programGPU = this.get( program );
2081
+
2082
+ programGPU.module = {
2083
+ module: this.device.createShaderModule( { code: program.code, label: program.stage + ( program.name !== '' ? `_${ program.name }` : '' ) } ),
2084
+ entryPoint: 'main'
2085
+ };
2086
+
2087
+ }
2088
+
2089
+ /**
2090
+ * Destroys the shader program of the given programmable stage.
2091
+ *
2092
+ * @param {ProgrammableStage} program - The programmable stage.
2093
+ */
2094
+ destroyProgram( program ) {
2095
+
2096
+ this.delete( program );
2097
+
2098
+ }
2099
+
2100
+ // pipelines
2101
+
2102
+ /**
2103
+ * Creates a render pipeline for the given render object.
2104
+ *
2105
+ * @param {RenderObject} renderObject - The render object.
2106
+ * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.
2107
+ */
2108
+ createRenderPipeline( renderObject, promises ) {
2109
+
2110
+ this.pipelineUtils.createRenderPipeline( renderObject, promises );
2111
+
2112
+ }
2113
+
2114
+ /**
2115
+ * Creates a compute pipeline for the given compute node.
2116
+ *
2117
+ * @param {ComputePipeline} computePipeline - The compute pipeline.
2118
+ * @param {Array<BindGroup>} bindings - The bindings.
2119
+ */
2120
+ createComputePipeline( computePipeline, bindings ) {
2121
+
2122
+ this.pipelineUtils.createComputePipeline( computePipeline, bindings );
2123
+
2124
+ }
2125
+
2126
+ /**
2127
+ * Prepares the state for encoding render bundles.
2128
+ *
2129
+ * @param {RenderContext} renderContext - The render context.
2130
+ */
2131
+ beginBundle( renderContext ) {
2132
+
2133
+ const renderContextData = this.get( renderContext );
2134
+
2135
+ renderContextData._currentPass = renderContextData.currentPass;
2136
+ renderContextData._currentSets = renderContextData.currentSets;
2137
+
2138
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
2139
+ renderContextData.currentPass = this.pipelineUtils.createBundleEncoder( renderContext );
2140
+
2141
+ }
2142
+
2143
+ /**
2144
+ * After processing render bundles this method finalizes related work.
2145
+ *
2146
+ * @param {RenderContext} renderContext - The render context.
2147
+ * @param {RenderBundle} bundle - The render bundle.
2148
+ */
2149
+ finishBundle( renderContext, bundle ) {
2150
+
2151
+ const renderContextData = this.get( renderContext );
2152
+
2153
+ const bundleEncoder = renderContextData.currentPass;
2154
+ const bundleGPU = bundleEncoder.finish();
2155
+
2156
+ this.get( bundle ).bundleGPU = bundleGPU;
2157
+
2158
+ // restore render pass state
2159
+
2160
+ renderContextData.currentSets = renderContextData._currentSets;
2161
+ renderContextData.currentPass = renderContextData._currentPass;
2162
+
2163
+ }
2164
+
2165
+ /**
2166
+ * Adds a render bundle to the render context data.
2167
+ *
2168
+ * @param {RenderContext} renderContext - The render context.
2169
+ * @param {RenderBundle} bundle - The render bundle to add.
2170
+ */
2171
+ addBundle( renderContext, bundle ) {
2172
+
2173
+ const renderContextData = this.get( renderContext );
2174
+
2175
+ renderContextData.renderBundles.push( this.get( bundle ).bundleGPU );
2176
+
2177
+ }
2178
+
2179
+ // bindings
2180
+
2181
+ /**
2182
+ * Creates bindings from the given bind group definition.
2183
+ *
2184
+ * @param {BindGroup} bindGroup - The bind group.
2185
+ * @param {Array<BindGroup>} bindings - Array of bind groups.
2186
+ * @param {number} cacheIndex - The cache index.
2187
+ * @param {number} version - The version.
2188
+ */
2189
+ createBindings( bindGroup, bindings, cacheIndex, version ) {
2190
+
2191
+ this.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version );
2192
+
2193
+ }
2194
+
2195
+ /**
2196
+ * Updates the given bind group definition.
2197
+ *
2198
+ * @param {BindGroup} bindGroup - The bind group.
2199
+ * @param {Array<BindGroup>} bindings - Array of bind groups.
2200
+ * @param {number} cacheIndex - The cache index.
2201
+ * @param {number} version - The version.
2202
+ */
2203
+ updateBindings( bindGroup, bindings, cacheIndex, version ) {
2204
+
2205
+ this.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version );
2206
+
2207
+ }
2208
+
2209
+ /**
2210
+ * Updates a buffer binding.
2211
+ *
2212
+ * @param {Buffer} binding - The buffer binding to update.
2213
+ */
2214
+ updateBinding( binding ) {
2215
+
2216
+ this.bindingUtils.updateBinding( binding );
2217
+
2218
+ }
2219
+
2220
+ /**
2221
+ * Delete data associated with the current bind group.
2222
+ *
2223
+ * @param {BindGroup} bindGroup - The bind group.
2224
+ */
2225
+ deleteBindGroupData( bindGroup ) {
2226
+
2227
+ this.bindingUtils.deleteBindGroupData( bindGroup );
2228
+
2229
+ }
2230
+
2231
+ // attributes
2232
+
2233
+ /**
2234
+ * Creates the buffer of an indexed shader attribute.
2235
+ *
2236
+ * @param {BufferAttribute} attribute - The indexed buffer attribute.
2237
+ */
2238
+ createIndexAttribute( attribute ) {
2239
+
2240
+ let usage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST;
2241
+
2242
+ if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {
2243
+
2244
+ usage |= GPUBufferUsage.STORAGE;
2245
+
2246
+ }
2247
+
2248
+ this.attributeUtils.createAttribute( attribute, usage );
2249
+
2250
+ }
2251
+
2252
+ /**
2253
+ * Creates the GPU buffer of a shader attribute.
2254
+ *
2255
+ * @param {BufferAttribute} attribute - The buffer attribute.
2256
+ */
2257
+ createAttribute( attribute ) {
2258
+
2259
+ this.attributeUtils.createAttribute( attribute, GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );
2260
+
2261
+ }
2262
+
2263
+ /**
2264
+ * Creates the GPU buffer of a storage attribute.
2265
+ *
2266
+ * @param {BufferAttribute} attribute - The buffer attribute.
2267
+ */
2268
+ createStorageAttribute( attribute ) {
2269
+
2270
+ this.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );
2271
+
2272
+ }
2273
+
2274
+ /**
2275
+ * Creates the GPU buffer of an indirect storage attribute.
2276
+ *
2277
+ * @param {BufferAttribute} attribute - The buffer attribute.
2278
+ */
2279
+ createIndirectStorageAttribute( attribute ) {
2280
+
2281
+ this.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );
2282
+
2283
+ }
2284
+
2285
+ /**
2286
+ * Updates the GPU buffer of a shader attribute.
2287
+ *
2288
+ * @param {BufferAttribute} attribute - The buffer attribute to update.
2289
+ */
2290
+ updateAttribute( attribute ) {
2291
+
2292
+ this.attributeUtils.updateAttribute( attribute );
2293
+
2294
+ }
2295
+
2296
+ /**
2297
+ * Destroys the GPU buffer of a shader attribute.
2298
+ *
2299
+ * @param {BufferAttribute} attribute - The buffer attribute to destroy.
2300
+ */
2301
+ destroyAttribute( attribute ) {
2302
+
2303
+ this.attributeUtils.destroyAttribute( attribute );
2304
+
2305
+ }
2306
+
2307
+ // canvas
2308
+
2309
+ /**
2310
+ * Triggers an update of the default render pass descriptor.
2311
+ */
2312
+ updateSize() {
2313
+
2314
+ this.delete( this.renderer.getCanvasTarget() );
2315
+
2316
+ }
2317
+
2318
+ // utils public
2319
+
2320
+ /**
2321
+ * Checks if the given feature is supported by the backend.
2322
+ *
2323
+ * @param {string} name - The feature's name.
2324
+ * @return {boolean} Whether the feature is supported or not.
2325
+ */
2326
+ hasFeature( name ) {
2327
+
2328
+ if ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];
2329
+
2330
+ return this.device.features.has( name );
2331
+
2332
+ }
2333
+
2334
+ /**
2335
+ * Copies data of the given source texture to the given destination texture.
2336
+ *
2337
+ * @param {Texture} srcTexture - The source texture.
2338
+ * @param {Texture} dstTexture - The destination texture.
2339
+ * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.
2340
+ * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.
2341
+ * @param {number} [srcLevel=0] - The mipmap level to copy.
2342
+ * @param {number} [dstLevel=0] - The destination mip level to copy to.
2343
+ */
2344
+ copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
2345
+
2346
+ let dstX = 0;
2347
+ let dstY = 0;
2348
+ let dstZ = 0;
2349
+
2350
+ let srcX = 0;
2351
+ let srcY = 0;
2352
+ let srcZ = 0;
2353
+
2354
+ let srcWidth = srcTexture.image.width;
2355
+ let srcHeight = srcTexture.image.height;
2356
+ let srcDepth = 1;
2357
+
2358
+
2359
+ if ( srcRegion !== null ) {
2360
+
2361
+ if ( srcRegion.isBox3 === true ) {
2362
+
2363
+ srcX = srcRegion.min.x;
2364
+ srcY = srcRegion.min.y;
2365
+ srcZ = srcRegion.min.z;
2366
+ srcWidth = srcRegion.max.x - srcRegion.min.x;
2367
+ srcHeight = srcRegion.max.y - srcRegion.min.y;
2368
+ srcDepth = srcRegion.max.z - srcRegion.min.z;
2369
+
2370
+ } else {
2371
+
2372
+ // Assume it's a Box2
2373
+ srcX = srcRegion.min.x;
2374
+ srcY = srcRegion.min.y;
2375
+ srcWidth = srcRegion.max.x - srcRegion.min.x;
2376
+ srcHeight = srcRegion.max.y - srcRegion.min.y;
2377
+ srcDepth = 1;
2378
+
2379
+ }
2380
+
2381
+ }
2382
+
2383
+
2384
+ if ( dstPosition !== null ) {
2385
+
2386
+ dstX = dstPosition.x;
2387
+ dstY = dstPosition.y;
2388
+ dstZ = dstPosition.z || 0;
2389
+
2390
+ }
2391
+
2392
+ const encoder = this.device.createCommandEncoder( { label: 'copyTextureToTexture_' + srcTexture.id + '_' + dstTexture.id } );
2393
+
2394
+ const sourceGPU = this.get( srcTexture ).texture;
2395
+ const destinationGPU = this.get( dstTexture ).texture;
2396
+
2397
+ encoder.copyTextureToTexture(
2398
+ {
2399
+ texture: sourceGPU,
2400
+ mipLevel: srcLevel,
2401
+ origin: { x: srcX, y: srcY, z: srcZ }
2402
+ },
2403
+ {
2404
+ texture: destinationGPU,
2405
+ mipLevel: dstLevel,
2406
+ origin: { x: dstX, y: dstY, z: dstZ }
2407
+ },
2408
+ [
2409
+ srcWidth,
2410
+ srcHeight,
2411
+ srcDepth
2412
+ ]
2413
+ );
2414
+
2415
+ this.device.queue.submit( [ encoder.finish() ] );
2416
+
2417
+ if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
2418
+
2419
+ this.textureUtils.generateMipmaps( dstTexture );
2420
+
2421
+ }
2422
+
2423
+ }
2424
+
2425
+ /**
2426
+ * Copies the current bound framebuffer to the given texture.
2427
+ *
2428
+ * @param {Texture} texture - The destination texture.
2429
+ * @param {RenderContext} renderContext - The render context.
2430
+ * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.
2431
+ */
2432
+ copyFramebufferToTexture( texture, renderContext, rectangle ) {
2433
+
2434
+ const renderContextData = this.get( renderContext );
2435
+
2436
+ let sourceGPU = null;
2437
+
2438
+ if ( renderContext.renderTarget ) {
2439
+
2440
+ if ( texture.isDepthTexture ) {
2441
+
2442
+ sourceGPU = this.get( renderContext.depthTexture ).texture;
2443
+
2444
+ } else {
2445
+
2446
+ sourceGPU = this.get( renderContext.textures[ 0 ] ).texture;
2447
+
2448
+ }
2449
+
2450
+ } else {
2451
+
2452
+ if ( texture.isDepthTexture ) {
2453
+
2454
+ sourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil );
2455
+
2456
+ } else {
2457
+
2458
+ sourceGPU = this.context.getCurrentTexture();
2459
+
2460
+ }
2461
+
2462
+ }
2463
+
2464
+ const destinationGPU = this.get( texture ).texture;
2465
+
2466
+ if ( sourceGPU.format !== destinationGPU.format ) {
2467
+
2468
+ error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
2469
+
2470
+ return;
2471
+
2472
+ }
2473
+
2474
+ let encoder;
2475
+
2476
+ if ( renderContextData.currentPass ) {
2477
+
2478
+ renderContextData.currentPass.end();
2479
+
2480
+ encoder = renderContextData.encoder;
2481
+
2482
+ } else {
2483
+
2484
+ encoder = this.device.createCommandEncoder( { label: 'copyFramebufferToTexture_' + texture.id } );
2485
+
2486
+ }
2487
+
2488
+ encoder.copyTextureToTexture(
2489
+ {
2490
+ texture: sourceGPU,
2491
+ origin: [ rectangle.x, rectangle.y, 0 ],
2492
+ },
2493
+ {
2494
+ texture: destinationGPU
2495
+ },
2496
+ [
2497
+ rectangle.z,
2498
+ rectangle.w
2499
+ ]
2500
+ );
2501
+
2502
+ // mipmaps must be genereated with the same encoder otherwise the copied texture data
2503
+ // might be out-of-sync, see #31768
2504
+
2505
+ if ( texture.generateMipmaps ) {
2506
+
2507
+ this.textureUtils.generateMipmaps( texture, encoder );
2508
+
2509
+ }
2510
+
2511
+ if ( renderContextData.currentPass ) {
2512
+
2513
+ const { descriptor } = renderContextData;
2514
+
2515
+ for ( let i = 0; i < descriptor.colorAttachments.length; i ++ ) {
2516
+
2517
+ descriptor.colorAttachments[ i ].loadOp = GPULoadOp.Load;
2518
+
2519
+ }
2520
+
2521
+ if ( renderContext.depth ) descriptor.depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
2522
+ if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
2523
+
2524
+ renderContextData.currentPass = encoder.beginRenderPass( descriptor );
2525
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
2526
+
2527
+ if ( renderContext.viewport ) {
2528
+
2529
+ this.updateViewport( renderContext );
2530
+
2531
+ }
2532
+
2533
+ if ( renderContext.scissor ) {
2534
+
2535
+ this.updateScissor( renderContext );
2536
+
2537
+ }
2538
+
2539
+ } else {
2540
+
2541
+ this.device.queue.submit( [ encoder.finish() ] );
2542
+
2543
+ }
2544
+
2545
+ }
2546
+
2547
+ /**
2548
+ * Checks if the given compatibility is supported by the backend.
2549
+ *
2550
+ * @param {string} name - The compatibility name.
2551
+ * @return {boolean} Whether the compatibility is supported or not.
2552
+ */
2553
+ hasCompatibility( name ) {
2554
+
2555
+ if ( this._compatibility[ name ] !== undefined ) {
2556
+
2557
+ return this._compatibility[ name ];
2558
+
2559
+ }
2560
+
2561
+ return super.hasCompatibility( name );
2562
+
2563
+ }
2564
+
2565
+ dispose() {
2566
+
2567
+ this.bindingUtils.dispose();
2568
+ this.textureUtils.dispose();
2569
+
2570
+ if ( this.occludedResolveCache ) {
2571
+
2572
+ for ( const buffer of this.occludedResolveCache.values() ) {
2573
+
2574
+ buffer.destroy();
2575
+
2576
+ }
2577
+
2578
+ this.occludedResolveCache.clear();
2579
+
2580
+ }
2581
+
2582
+ if ( this.timestampQueryPool ) {
2583
+
2584
+ for ( const queryPool of Object.values( this.timestampQueryPool ) ) {
2585
+
2586
+ if ( queryPool !== null ) queryPool.dispose();
2587
+
2588
+ }
2589
+
2590
+ }
2591
+
2592
+ if ( this.parameters.device === undefined && this.device !== null ) {
2593
+
2594
+ this.device.destroy();
2595
+
2596
+ }
2597
+
2598
+ }
2599
+
2600
+ }
2601
+
2602
+ export default WebGPUBackend;