super-three 0.144.0 → 0.147.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 (450) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +735 -387
  3. package/build/three.js +735 -387
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +910 -408
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +50 -67
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +70 -134
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +138 -405
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -54
  14. package/examples/js/controls/FlyControls.js +29 -55
  15. package/examples/js/controls/OrbitControls.js +125 -99
  16. package/examples/js/controls/PointerLockControls.js +5 -14
  17. package/examples/js/controls/TrackballControls.js +33 -86
  18. package/examples/js/controls/TransformControls.js +85 -170
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +4 -18
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +26 -30
  30. package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
  31. package/examples/js/effects/PeppersGhostEffect.js +12 -39
  32. package/examples/js/effects/StereoEffect.js +0 -4
  33. package/examples/js/environments/RoomEnvironment.js +12 -10
  34. package/examples/js/exporters/ColladaExporter.js +48 -65
  35. package/examples/js/exporters/DRACOExporter.js +22 -22
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +141 -317
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +42 -33
  40. package/examples/js/exporters/PLYExporter.js +38 -33
  41. package/examples/js/exporters/STLExporter.js +5 -7
  42. package/examples/js/exporters/USDZExporter.js +113 -27
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +11 -6
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +25 -12
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +25 -39
  60. package/examples/js/interactive/InteractiveGroup.js +9 -14
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +0 -8
  63. package/examples/js/lights/LightProbeGenerator.js +32 -39
  64. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  65. package/examples/js/lines/LineGeometry.js +3 -5
  66. package/examples/js/lines/LineMaterial.js +4 -11
  67. package/examples/js/lines/LineSegments2.js +40 -89
  68. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  69. package/examples/js/lines/Wireframe.js +2 -7
  70. package/examples/js/lines/WireframeGeometry2.js +3 -1
  71. package/examples/js/loaders/3DMLoader.js +58 -155
  72. package/examples/js/loaders/3MFLoader.js +72 -106
  73. package/examples/js/loaders/AMFLoader.js +0 -25
  74. package/examples/js/loaders/BVHLoader.js +44 -43
  75. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  76. package/examples/js/loaders/ColladaLoader.js +228 -359
  77. package/examples/js/loaders/DDSLoader.js +24 -25
  78. package/examples/js/loaders/DRACOLoader.js +29 -66
  79. package/examples/js/loaders/EXRLoader.js +67 -164
  80. package/examples/js/loaders/FBXLoader.js +287 -441
  81. package/examples/js/loaders/FontLoader.js +6 -15
  82. package/examples/js/loaders/GCodeLoader.js +15 -16
  83. package/examples/js/loaders/GLTFLoader.js +409 -706
  84. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
  85. package/examples/js/loaders/KMZLoader.js +3 -7
  86. package/examples/js/loaders/KTXLoader.js +12 -30
  87. package/examples/js/loaders/LDrawLoader.js +178 -289
  88. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  89. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  90. package/examples/js/loaders/LWOLoader.js +59 -124
  91. package/examples/js/loaders/LogLuvLoader.js +27 -77
  92. package/examples/js/loaders/LottieLoader.js +4 -4
  93. package/examples/js/loaders/MD2Loader.js +26 -27
  94. package/examples/js/loaders/MDDLoader.js +6 -10
  95. package/examples/js/loaders/MMDLoader.js +180 -189
  96. package/examples/js/loaders/MTLLoader.js +18 -47
  97. package/examples/js/loaders/NRRDLoader.js +44 -84
  98. package/examples/js/loaders/OBJLoader.js +50 -65
  99. package/examples/js/loaders/PCDLoader.js +34 -29
  100. package/examples/js/loaders/PDBLoader.js +17 -13
  101. package/examples/js/loaders/PLYLoader.js +62 -48
  102. package/examples/js/loaders/PRWMLoader.js +11 -22
  103. package/examples/js/loaders/PVRLoader.js +7 -16
  104. package/examples/js/loaders/RGBELoader.js +36 -61
  105. package/examples/js/loaders/RGBMLoader.js +26 -87
  106. package/examples/js/loaders/STLLoader.js +20 -27
  107. package/examples/js/loaders/SVGLoader.js +361 -233
  108. package/examples/js/loaders/TDSLoader.js +81 -118
  109. package/examples/js/loaders/TGALoader.js +39 -41
  110. package/examples/js/loaders/TIFFLoader.js +0 -1
  111. package/examples/js/loaders/TTFLoader.js +0 -8
  112. package/examples/js/loaders/TiltLoader.js +14 -15
  113. package/examples/js/loaders/VOXLoader.js +8 -16
  114. package/examples/js/loaders/VRMLLoader.js +243 -340
  115. package/examples/js/loaders/VTKLoader.js +101 -118
  116. package/examples/js/loaders/XYZLoader.js +2 -4
  117. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  118. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  119. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  120. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  121. package/examples/js/math/Capsule.js +0 -17
  122. package/examples/js/math/ColorConverter.js +3 -3
  123. package/examples/js/math/ConvexHull.js +185 -141
  124. package/examples/js/math/ImprovedNoise.js +1 -1
  125. package/examples/js/math/Lut.js +8 -15
  126. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  127. package/examples/js/math/OBB.js +90 -49
  128. package/examples/js/math/Octree.js +2 -57
  129. package/examples/js/math/SimplexNoise.js +74 -88
  130. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  131. package/examples/js/misc/GPUComputationRenderer.js +26 -16
  132. package/examples/js/misc/Gyroscope.js +5 -9
  133. package/examples/js/misc/MD2Character.js +14 -23
  134. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  135. package/examples/js/misc/MorphAnimMesh.js +0 -6
  136. package/examples/js/misc/MorphBlendMesh.js +3 -30
  137. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  138. package/examples/js/misc/RollerCoaster.js +17 -24
  139. package/examples/js/misc/TubePainter.js +18 -12
  140. package/examples/js/misc/Volume.js +16 -45
  141. package/examples/js/misc/VolumeSlice.js +14 -24
  142. package/examples/js/modifiers/CurveModifier.js +19 -21
  143. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  144. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  145. package/examples/js/modifiers/TessellateModifier.js +2 -9
  146. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  147. package/examples/js/objects/Lensflare.js +47 -38
  148. package/examples/js/objects/LightningStorm.js +10 -13
  149. package/examples/js/objects/MarchingCubes.js +80 -59
  150. package/examples/js/objects/Reflector.js +22 -20
  151. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  152. package/examples/js/objects/Refractor.js +52 -30
  153. package/examples/js/objects/ShadowMesh.js +1 -2
  154. package/examples/js/objects/Sky.js +2 -7
  155. package/examples/js/objects/Water.js +23 -18
  156. package/examples/js/objects/Water2.js +20 -19
  157. package/examples/js/physics/AmmoPhysics.js +23 -20
  158. package/examples/js/physics/OimoPhysics.js +19 -17
  159. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  160. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  161. package/examples/js/postprocessing/BloomPass.js +38 -17
  162. package/examples/js/postprocessing/BokehPass.js +29 -12
  163. package/examples/js/postprocessing/ClearPass.js +1 -6
  164. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  165. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  166. package/examples/js/postprocessing/EffectComposer.js +25 -32
  167. package/examples/js/postprocessing/FilmPass.js +7 -5
  168. package/examples/js/postprocessing/GlitchPass.js +10 -11
  169. package/examples/js/postprocessing/HalftonePass.js +9 -9
  170. package/examples/js/postprocessing/LUTPass.js +2 -15
  171. package/examples/js/postprocessing/MaskPass.js +20 -17
  172. package/examples/js/postprocessing/OutlinePass.js +45 -36
  173. package/examples/js/postprocessing/Pass.js +11 -14
  174. package/examples/js/postprocessing/RenderPass.js +3 -7
  175. package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
  176. package/examples/js/postprocessing/SAOPass.js +40 -32
  177. package/examples/js/postprocessing/SMAAPass.js +34 -17
  178. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  179. package/examples/js/postprocessing/SSAOPass.js +56 -42
  180. package/examples/js/postprocessing/SSRPass.js +78 -61
  181. package/examples/js/postprocessing/SavePass.js +14 -6
  182. package/examples/js/postprocessing/ShaderPass.js +9 -8
  183. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  184. package/examples/js/postprocessing/TexturePass.js +7 -4
  185. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  186. package/examples/js/renderers/CSS2DRenderer.js +2 -21
  187. package/examples/js/renderers/CSS3DRenderer.js +3 -24
  188. package/examples/js/renderers/Projector.js +29 -85
  189. package/examples/js/renderers/SVGRenderer.js +4 -50
  190. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  191. package/examples/js/shaders/AfterimageShader.js +3 -6
  192. package/examples/js/shaders/BasicShader.js +3 -6
  193. package/examples/js/shaders/BleachBypassShader.js +3 -6
  194. package/examples/js/shaders/BlendShader.js +3 -6
  195. package/examples/js/shaders/BokehShader.js +3 -6
  196. package/examples/js/shaders/BokehShader2.js +4 -13
  197. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  198. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  199. package/examples/js/shaders/ColorifyShader.js +2 -6
  200. package/examples/js/shaders/ConvolutionShader.js +5 -10
  201. package/examples/js/shaders/CopyShader.js +3 -6
  202. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  203. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  204. package/examples/js/shaders/DigitalGlitch.js +3 -6
  205. package/examples/js/shaders/DotScreenShader.js +2 -6
  206. package/examples/js/shaders/FXAAShader.js +1 -3
  207. package/examples/js/shaders/FilmShader.js +3 -6
  208. package/examples/js/shaders/FocusShader.js +3 -6
  209. package/examples/js/shaders/FreiChenShader.js +2 -6
  210. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  211. package/examples/js/shaders/GodRaysShader.js +11 -24
  212. package/examples/js/shaders/HalftoneShader.js +3 -6
  213. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  214. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  215. package/examples/js/shaders/HueSaturationShader.js +3 -6
  216. package/examples/js/shaders/KaleidoShader.js +3 -6
  217. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  218. package/examples/js/shaders/LuminosityShader.js +3 -6
  219. package/examples/js/shaders/MMDToonShader.js +2 -8
  220. package/examples/js/shaders/MirrorShader.js +3 -6
  221. package/examples/js/shaders/NormalMapShader.js +2 -6
  222. package/examples/js/shaders/RGBShiftShader.js +3 -6
  223. package/examples/js/shaders/SAOShader.js +2 -6
  224. package/examples/js/shaders/SMAAShader.js +6 -18
  225. package/examples/js/shaders/SSAOShader.js +2 -6
  226. package/examples/js/shaders/SSRShader.js +6 -18
  227. package/examples/js/shaders/SepiaShader.js +3 -6
  228. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  229. package/examples/js/shaders/TechnicolorShader.js +3 -6
  230. package/examples/js/shaders/ToneMapShader.js +3 -6
  231. package/examples/js/shaders/ToonShader.js +8 -24
  232. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  233. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  234. package/examples/js/shaders/VelocityShader.js +126 -0
  235. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  236. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  237. package/examples/js/shaders/VignetteShader.js +3 -6
  238. package/examples/js/shaders/VolumeShader.js +2 -6
  239. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  240. package/examples/js/textures/FlakesTexture.js +0 -1
  241. package/examples/js/utils/BufferGeometryUtils.js +236 -170
  242. package/examples/js/utils/CameraUtils.js +5 -20
  243. package/examples/js/utils/GPUStatsPanel.js +3 -12
  244. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  245. package/examples/js/utils/GeometryUtils.js +13 -18
  246. package/examples/js/utils/LDrawUtils.js +8 -11
  247. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  248. package/examples/js/utils/SceneUtils.js +117 -6
  249. package/examples/js/utils/ShadowMapViewer.js +17 -14
  250. package/examples/js/utils/SkeletonUtils.js +13 -27
  251. package/examples/js/utils/UVsDebug.js +20 -12
  252. package/examples/js/utils/WorkerPool.js +1 -11
  253. package/examples/jsm/animation/CCDIKSolver.js +27 -3
  254. package/examples/jsm/animation/MMDPhysics.js +25 -0
  255. package/examples/jsm/capabilities/WebGPU.js +3 -1
  256. package/examples/jsm/controls/FirstPersonControls.js +20 -20
  257. package/examples/jsm/controls/FlyControls.js +16 -17
  258. package/examples/jsm/controls/OrbitControls.js +44 -4
  259. package/examples/jsm/controls/TrackballControls.js +14 -2
  260. package/examples/jsm/controls/TransformControls.js +1 -1
  261. package/examples/jsm/csm/CSM.js +1 -0
  262. package/examples/jsm/csm/CSMHelper.js +30 -0
  263. package/examples/jsm/exporters/GLTFExporter.js +0 -79
  264. package/examples/jsm/exporters/USDZExporter.js +93 -1
  265. package/examples/jsm/helpers/OctreeHelper.js +22 -8
  266. package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
  267. package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
  268. package/examples/jsm/helpers/ViewHelper.js +24 -0
  269. package/examples/jsm/interactive/HTMLMesh.js +5 -6
  270. package/examples/jsm/interactive/InteractiveGroup.js +4 -2
  271. package/examples/jsm/libs/flow.module.js +610 -160
  272. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  273. package/examples/jsm/lines/LineSegments2.js +4 -0
  274. package/examples/jsm/loaders/3DMLoader.js +1 -2
  275. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  276. package/examples/jsm/loaders/FBXLoader.js +18 -2
  277. package/examples/jsm/loaders/GLTFLoader.js +269 -428
  278. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  279. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  280. package/examples/jsm/loaders/LottieLoader.js +4 -2
  281. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  282. package/examples/jsm/loaders/PCDLoader.js +1 -1
  283. package/examples/jsm/loaders/PLYLoader.js +68 -16
  284. package/examples/jsm/loaders/SVGLoader.js +227 -14
  285. package/examples/jsm/loaders/USDZLoader.js +351 -111
  286. package/examples/jsm/loaders/VRMLLoader.js +13 -1
  287. package/examples/jsm/math/ConvexHull.js +4 -4
  288. package/examples/jsm/math/Octree.js +1 -1
  289. package/examples/jsm/node-editor/NodeEditor.js +91 -12
  290. package/examples/jsm/node-editor/core/BaseNode.js +10 -3
  291. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +6 -9
  292. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +6 -9
  293. package/examples/jsm/node-editor/math/AngleEditor.js +3 -3
  294. package/examples/jsm/node-editor/math/InvertEditor.js +2 -2
  295. package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
  296. package/examples/jsm/node-editor/utils/PreviewEditor.js +4 -0
  297. package/examples/jsm/nodes/Nodes.js +30 -3
  298. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  299. package/examples/jsm/nodes/accessors/NormalNode.js +6 -6
  300. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  301. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  302. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  303. package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
  304. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  305. package/examples/jsm/nodes/core/AttributeNode.js +31 -8
  306. package/examples/jsm/nodes/core/Node.js +1 -1
  307. package/examples/jsm/nodes/core/NodeBuilder.js +55 -6
  308. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  309. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  310. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  311. package/examples/jsm/nodes/core/constants.js +13 -13
  312. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  313. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -12
  314. package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
  315. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  316. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  317. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
  318. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
  319. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
  320. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  321. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  322. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  323. package/examples/jsm/nodes/materials/Materials.js +9 -7
  324. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  325. package/examples/jsm/nodes/materialx/{Disclaimer.md → DISCLAIMER.md} +1 -1
  326. package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
  327. package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_hsv.js +1 -1
  328. package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_noise.js +13 -3
  329. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  330. package/examples/jsm/nodes/math/MathNode.js +5 -5
  331. package/examples/jsm/nodes/math/OperatorNode.js +16 -3
  332. package/examples/jsm/nodes/shadernode/ShaderNode.js +35 -20
  333. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +87 -63
  334. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +29 -0
  335. package/examples/jsm/nodes/utils/ConvertNode.js +15 -14
  336. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  337. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  338. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  339. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  340. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  341. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  342. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  343. package/examples/jsm/nodes/utils/TimerNode.js +21 -1
  344. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  345. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  346. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  347. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  348. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  349. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  350. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  351. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  352. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  353. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  354. package/examples/jsm/postprocessing/OutlinePass.js +21 -1
  355. package/examples/jsm/postprocessing/Pass.js +2 -0
  356. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  357. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  358. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  359. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  360. package/examples/jsm/postprocessing/SavePass.js +17 -1
  361. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  362. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  363. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  364. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  365. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +56 -35
  366. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  367. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  368. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  369. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  370. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +41 -9
  371. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  372. package/examples/jsm/shaders/VelocityShader.js +128 -0
  373. package/examples/jsm/utils/BufferGeometryUtils.js +174 -42
  374. package/examples/jsm/utils/SceneUtils.js +129 -4
  375. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  376. package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
  377. package/package.json +13 -13
  378. package/src/Three.js +1 -0
  379. package/src/animation/PropertyBinding.js +7 -0
  380. package/src/audio/AudioContext.js +5 -5
  381. package/src/cameras/CubeCamera.js +14 -14
  382. package/src/constants.js +1 -1
  383. package/src/core/InstancedBufferGeometry.js +1 -7
  384. package/src/core/InterleavedBufferAttribute.js +4 -4
  385. package/src/extras/Earcut.js +67 -67
  386. package/src/geometries/PolyhedronGeometry.js +1 -1
  387. package/src/geometries/ShapeGeometry.js +1 -1
  388. package/src/helpers/ArrowHelper.js +9 -0
  389. package/src/helpers/Box3Helper.js +7 -0
  390. package/src/helpers/BoxHelper.js +7 -1
  391. package/src/helpers/DirectionalLightHelper.js +5 -1
  392. package/src/helpers/GridHelper.js +7 -0
  393. package/src/helpers/HemisphereLightHelper.js +4 -1
  394. package/src/helpers/PlaneHelper.js +9 -0
  395. package/src/helpers/PointLightHelper.js +2 -1
  396. package/src/helpers/PolarGridHelper.js +7 -0
  397. package/src/helpers/SkeletonHelper.js +7 -0
  398. package/src/helpers/SpotLightHelper.js +4 -2
  399. package/src/lights/LightShadow.js +1 -2
  400. package/src/lights/PointLight.js +2 -2
  401. package/src/lights/SpotLight.js +2 -2
  402. package/src/loaders/FileLoader.js +4 -1
  403. package/src/loaders/ObjectLoader.js +5 -1
  404. package/src/materials/Material.js +1 -1
  405. package/src/materials/MeshPhysicalMaterial.js +1 -1
  406. package/src/math/Color.js +5 -5
  407. package/src/math/Matrix3.js +53 -18
  408. package/src/math/Ray.js +2 -5
  409. package/src/math/Sphere.js +36 -21
  410. package/src/objects/InstancedMesh.js +7 -0
  411. package/src/objects/LOD.js +25 -6
  412. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  413. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  414. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  415. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  416. package/src/renderers/WebGLRenderTarget.js +1 -1
  417. package/src/renderers/WebGLRenderer.js +36 -62
  418. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  419. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  420. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  421. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  422. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  423. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
  424. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  425. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
  426. package/src/renderers/shaders/ShaderChunk.js +3 -0
  427. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  428. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  429. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  430. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
  431. package/src/renderers/shaders/ShaderLib.js +20 -6
  432. package/src/renderers/shaders/UniformsLib.js +1 -1
  433. package/src/renderers/shaders/UniformsUtils.js +15 -0
  434. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  435. package/src/renderers/webgl/WebGLBackground.js +15 -7
  436. package/src/renderers/webgl/WebGLLights.js +0 -4
  437. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  438. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  439. package/src/renderers/webgl/WebGLState.js +78 -41
  440. package/src/renderers/webgl/WebGLTextures.js +94 -39
  441. package/src/renderers/webgl/WebGLUniforms.js +152 -24
  442. package/src/renderers/webgl/WebGLUtils.js +1 -1
  443. package/src/renderers/webxr/WebXRController.js +46 -13
  444. package/src/renderers/webxr/WebXRManager.js +70 -2
  445. package/src/scenes/Scene.js +8 -0
  446. package/src/textures/CompressedArrayTexture.js +18 -0
  447. package/src/textures/Texture.js +2 -1
  448. package/examples/js/libs/lottie_canvas.js +0 -12751
  449. package/examples/js/shaders/PixelShader.js +0 -51
  450. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -1,7 +1,6 @@
1
1
  import { defaultShaderStages, NodeFrame, MathNode, GLSLNodeParser, NodeBuilder } from 'three/nodes';
2
2
  import SlotNode from './SlotNode.js';
3
- import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib,
4
- LinearEncoding, RGBAFormat, UnsignedByteType, sRGBEncoding } from 'three';
3
+ import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib } from 'three';
5
4
 
6
5
  const nodeFrame = new NodeFrame();
7
6
  nodeFrame.camera = new PerspectiveCamera();
@@ -73,7 +72,17 @@ class WebGLNodeBuilder extends NodeBuilder {
73
72
 
74
73
  _parseShaderLib() {
75
74
 
76
- const type = this.material.type;
75
+ const material = this.material;
76
+
77
+ let type = material.type;
78
+
79
+ // see https://github.com/mrdoob/three.js/issues/23707
80
+
81
+ if ( material.isMeshPhysicalNodeMaterial ) type = 'MeshPhysicalNodeMaterial';
82
+ else if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial';
83
+ else if ( material.isMeshBasicNodeMaterial ) type = 'MeshBasicNodeMaterial';
84
+ else if ( material.isPointsNodeMaterial ) type = 'PointsNodeMaterial';
85
+ else if ( material.isLineBasicNodeMaterial ) type = 'LineBasicNodeMaterial';
77
86
 
78
87
  // shader lib
79
88
 
@@ -112,9 +121,8 @@ class WebGLNodeBuilder extends NodeBuilder {
112
121
  this.addSlot( 'fragment', new SlotNode( {
113
122
  node: material.colorNode,
114
123
  nodeType: 'vec4',
115
- source: getIncludeSnippet( 'color_fragment' ),
116
- target: 'diffuseColor = %RESULT%;',
117
- inclusionType: 'append'
124
+ source: 'vec4 diffuseColor = vec4( diffuse, opacity );',
125
+ target: 'vec4 diffuseColor = %RESULT%;'
118
126
  } ) );
119
127
 
120
128
  }
@@ -129,6 +137,10 @@ class WebGLNodeBuilder extends NodeBuilder {
129
137
  inclusionType: 'append'
130
138
  } ) );
131
139
 
140
+ } else {
141
+
142
+ this.addCode( 'fragment', getIncludeSnippet( 'alphatest_fragment' ), 'diffuseColor.a = opacity;', this.shader );
143
+
132
144
  }
133
145
 
134
146
  if ( material.normalNode && material.normalNode.isNode ) {
@@ -498,15 +510,31 @@ class WebGLNodeBuilder extends NodeBuilder {
498
510
 
499
511
  }
500
512
 
501
- getVaryings( /* shaderStage */ ) {
513
+ getVaryings( shaderStage ) {
502
514
 
503
515
  let snippet = '';
504
516
 
505
517
  const varyings = this.varyings;
506
518
 
507
- for ( const varying of varyings ) {
519
+ if ( shaderStage === 'vertex' ) {
520
+
521
+ for ( const varying of varyings ) {
522
+
523
+ snippet += `${varying.needsInterpolation ? 'varying' : '/*varying*/'} ${varying.type} ${varying.name}; `;
524
+
525
+ }
526
+
527
+ } else if ( shaderStage === 'fragment' ) {
528
+
529
+ for ( const varying of varyings ) {
530
+
531
+ if ( varying.needsInterpolation ) {
508
532
 
509
- snippet += `varying ${varying.type} ${varying.name}; `;
533
+ snippet += `varying ${varying.type} ${varying.name}; `;
534
+
535
+ }
536
+
537
+ }
510
538
 
511
539
  }
512
540
 
@@ -514,52 +542,50 @@ class WebGLNodeBuilder extends NodeBuilder {
514
542
 
515
543
  }
516
544
 
517
- addCodeAfterCode( shaderStage, snippet, code ) {
545
+ addCode( shaderStage, source, code, scope = this ) {
518
546
 
519
547
  const shaderProperty = getShaderStageProperty( shaderStage );
520
548
 
521
- let source = this[ shaderProperty ];
549
+ let snippet = scope[ shaderProperty ];
522
550
 
523
- const index = source.indexOf( snippet );
551
+ const index = snippet.indexOf( source );
524
552
 
525
553
  if ( index !== - 1 ) {
526
554
 
527
- const start = source.substring( 0, index + snippet.length );
528
- const end = source.substring( index + snippet.length );
555
+ const start = snippet.substring( 0, index + source.length );
556
+ const end = snippet.substring( index + source.length );
529
557
 
530
- source = `${start}\n${code}\n${end}`;
558
+ snippet = `${start}\n${code}\n${end}`;
531
559
 
532
560
  }
533
561
 
534
- this[ shaderProperty ] = source;
562
+ scope[ shaderProperty ] = snippet;
535
563
 
536
564
  }
537
565
 
538
- replaceCode( shaderStage, source, target ) {
566
+ replaceCode( shaderStage, source, target, scope = this ) {
539
567
 
540
568
  const shaderProperty = getShaderStageProperty( shaderStage );
541
569
 
542
- this[ shaderProperty ] = this[ shaderProperty ].replaceAll( source, target );
570
+ scope[ shaderProperty ] = scope[ shaderProperty ].replaceAll( source, target );
543
571
 
544
572
  }
545
573
 
546
- getTextureEncodingFromMap( map ) {
547
-
548
- const isWebGL2 = this.renderer.capabilities.isWebGL2;
574
+ getFrontFacing() {
549
575
 
550
- if ( isWebGL2 && map && map.isTexture && map.format === RGBAFormat && map.type === UnsignedByteType && map.encoding === sRGBEncoding ) {
576
+ return 'gl_FrontFacing';
551
577
 
552
- return LinearEncoding; // disable inline decode for sRGB textures in WebGL 2
578
+ }
553
579
 
554
- }
580
+ getFragCoord() {
555
581
 
556
- return super.getTextureEncodingFromMap( map );
582
+ return 'gl_FragCoord';
557
583
 
558
584
  }
559
585
 
560
- getFrontFacing() {
586
+ isFlipY() {
561
587
 
562
- return 'gl_FrontFacing';
588
+ return true;
563
589
 
564
590
  }
565
591
 
@@ -644,11 +670,6 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]}
644
670
 
645
671
  const slots = this.slots[ shaderStage ].sort( ( slotA, slotB ) => {
646
672
 
647
- if ( sourceCode.indexOf( slotA.source ) == - 1 ) {
648
- //console.log( slotA, sourceCode.indexOf( slotA.source ), sourceCode.indexOf( slotB.source ) );
649
- //console.log(sourceCode);
650
- }
651
-
652
673
  return sourceCode.indexOf( slotA.source ) > sourceCode.indexOf( slotB.source ) ? 1 : - 1;
653
674
 
654
675
  } );
@@ -677,7 +698,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]}
677
698
 
678
699
  if ( inclusionType === 'append' ) {
679
700
 
680
- this.addCodeAfterCode( shaderStage, source, target );
701
+ this.addCode( shaderStage, source, target );
681
702
 
682
703
  } else if ( inclusionType === 'replace' ) {
683
704
 
@@ -691,10 +712,10 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]}
691
712
 
692
713
  }
693
714
 
694
- this.addCodeAfterCode(
715
+ this.addCode(
695
716
  shaderStage,
696
717
  'main() {',
697
- this.flowCode[ shaderStage ]
718
+ '\n\t' + this.flowCode[ shaderStage ]
698
719
  );
699
720
 
700
721
  }
@@ -0,0 +1,58 @@
1
+ class WebGPUAnimation {
2
+
3
+ constructor() {
4
+
5
+ this.nodes = null;
6
+
7
+ this.animationLoop = null;
8
+ this.requestId = null;
9
+
10
+ this.isAnimating = false;
11
+
12
+ this.context = self;
13
+
14
+ }
15
+
16
+ start() {
17
+
18
+ if ( this.isAnimating === true || this.animationLoop === null || this.nodes === null ) return;
19
+
20
+ this.isAnimating = true;
21
+
22
+ const update = ( time, frame ) => {
23
+
24
+ this.requestId = self.requestAnimationFrame( update );
25
+
26
+ this.animationLoop( time, frame );
27
+
28
+ this.nodes.updateFrame();
29
+
30
+ };
31
+
32
+ this.requestId = self.requestAnimationFrame( update );
33
+
34
+ }
35
+
36
+ stop() {
37
+
38
+ self.cancelAnimationFrame( this.requestId );
39
+
40
+ this.isAnimating = false;
41
+
42
+ }
43
+
44
+ setAnimationLoop( callback ) {
45
+
46
+ this.animationLoop = callback;
47
+
48
+ }
49
+
50
+ setNodes( nodes ) {
51
+
52
+ this.nodes = nodes;
53
+
54
+ }
55
+
56
+ }
57
+
58
+ export default WebGPUAnimation;
@@ -23,7 +23,7 @@ class WebGPUAttributes {
23
23
 
24
24
  if ( data ) {
25
25
 
26
- data.buffer.destroy();
26
+ this._destroyBuffers( data );
27
27
 
28
28
  this.buffers.delete( attribute );
29
29
 
@@ -51,7 +51,7 @@ class WebGPUAttributes {
51
51
 
52
52
  } else if ( usage && usage !== data.usage ) {
53
53
 
54
- data.buffer.destroy();
54
+ this._destroyBuffers( data );
55
55
 
56
56
  data = this._createBuffer( attribute, usage );
57
57
 
@@ -67,6 +67,53 @@ class WebGPUAttributes {
67
67
 
68
68
  }
69
69
 
70
+ async getArrayBuffer( attribute ) {
71
+
72
+ const data = this.get( attribute );
73
+ const device = this.device;
74
+
75
+ const gpuBuffer = data.buffer;
76
+ const size = gpuBuffer.size;
77
+
78
+ let gpuReadBuffer = data.readBuffer;
79
+ let needsUnmap = true;
80
+
81
+ if ( gpuReadBuffer === null ) {
82
+
83
+ gpuReadBuffer = device.createBuffer( {
84
+ size,
85
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
86
+ } );
87
+
88
+ needsUnmap = false;
89
+
90
+ data.readBuffer = gpuReadBuffer;
91
+
92
+ }
93
+
94
+ const cmdEncoder = device.createCommandEncoder( {} );
95
+
96
+ cmdEncoder.copyBufferToBuffer(
97
+ gpuBuffer,
98
+ 0,
99
+ gpuReadBuffer,
100
+ 0,
101
+ size
102
+ );
103
+
104
+ if ( needsUnmap ) gpuReadBuffer.unmap();
105
+
106
+ const gpuCommands = cmdEncoder.finish();
107
+ device.queue.submit( [ gpuCommands ] );
108
+
109
+ await gpuReadBuffer.mapAsync( GPUMapMode.READ );
110
+
111
+ const arrayBuffer = gpuReadBuffer.getMappedRange();
112
+
113
+ return new Float32Array( arrayBuffer );
114
+
115
+ }
116
+
70
117
  _createBuffer( attribute, usage ) {
71
118
 
72
119
  const array = attribute.array;
@@ -74,7 +121,7 @@ class WebGPUAttributes {
74
121
 
75
122
  const buffer = this.device.createBuffer( {
76
123
  size,
77
- usage: usage | GPUBufferUsage.COPY_DST,
124
+ usage: usage | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
78
125
  mappedAtCreation: true
79
126
  } );
80
127
 
@@ -87,6 +134,7 @@ class WebGPUAttributes {
87
134
  return {
88
135
  version: attribute.version,
89
136
  buffer,
137
+ readBuffer: null,
90
138
  usage
91
139
  };
92
140
 
@@ -94,6 +142,8 @@ class WebGPUAttributes {
94
142
 
95
143
  _writeBuffer( buffer, attribute ) {
96
144
 
145
+ const device = this.device;
146
+
97
147
  const array = attribute.array;
98
148
  const updateRange = attribute.updateRange;
99
149
 
@@ -101,7 +151,7 @@ class WebGPUAttributes {
101
151
 
102
152
  // Not using update ranges
103
153
 
104
- this.device.queue.writeBuffer(
154
+ device.queue.writeBuffer(
105
155
  buffer,
106
156
  0,
107
157
  array,
@@ -110,7 +160,7 @@ class WebGPUAttributes {
110
160
 
111
161
  } else {
112
162
 
113
- this.device.queue.writeBuffer(
163
+ device.queue.writeBuffer(
114
164
  buffer,
115
165
  0,
116
166
  array,
@@ -124,6 +174,14 @@ class WebGPUAttributes {
124
174
 
125
175
  }
126
176
 
177
+ _destroyBuffers( { buffer, readBuffer } ) {
178
+
179
+ buffer.destroy();
180
+
181
+ if ( readBuffer !== null ) readBuffer.destroy();
182
+
183
+ }
184
+
127
185
  }
128
186
 
129
187
  export default WebGPUAttributes;
@@ -1,6 +1,6 @@
1
1
  import { GPULoadOp, GPUStoreOp } from './constants.js';
2
- import { Color, Mesh, BoxGeometry, BackSide } from 'three';
3
- import { context, transformDirection, positionWorld, modelWorldMatrix, MeshBasicNodeMaterial } from 'three/nodes';
2
+ import { Color, Mesh, BoxGeometry, BackSide, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
3
+ import { context, vec2, invert, texture, cubeTexture, transformDirection, positionWorld, modelWorldMatrix, viewportBottomLeft, equirectUV, MeshBasicNodeMaterial } from 'three/nodes';
4
4
 
5
5
  let _clearAlpha;
6
6
  const _clearColor = new Color();
@@ -45,7 +45,7 @@ class WebGPUBackground {
45
45
  _clearAlpha = 1;
46
46
  forceClear = true;
47
47
 
48
- } else if ( background.isNode === true ) {
48
+ } else if ( background.isNode === true || background.isTexture === true ) {
49
49
 
50
50
  _clearColor.copy( renderer._clearColor );
51
51
  _clearAlpha = renderer._clearAlpha;
@@ -54,12 +54,41 @@ class WebGPUBackground {
54
54
 
55
55
  if ( boxMesh === null ) {
56
56
 
57
- const colorNode = context( background, {
58
- uvNode: transformDirection( positionWorld, modelWorldMatrix )
59
- } );
57
+ let node = null;
58
+
59
+ if ( background.isCubeTexture === true ) {
60
+
61
+ node = cubeTexture( background, transformDirection( positionWorld, modelWorldMatrix ) );
62
+
63
+ } else if ( background.isTexture === true ) {
64
+
65
+ let nodeUV = null;
66
+
67
+ if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
68
+
69
+ const dirNode = transformDirection( positionWorld, modelWorldMatrix );
70
+
71
+ nodeUV = equirectUV( dirNode );
72
+ nodeUV = vec2( nodeUV.x, invert( nodeUV.y ) );
73
+
74
+ } else {
75
+
76
+ nodeUV = viewportBottomLeft;
77
+
78
+ }
79
+
80
+ node = texture( background, nodeUV );
81
+
82
+ } else /*if ( background.isNode === true )*/ {
83
+
84
+ node = context( background, {
85
+ uvNode: transformDirection( positionWorld, modelWorldMatrix )
86
+ } );
87
+
88
+ }
60
89
 
61
90
  const nodeMaterial = new MeshBasicNodeMaterial();
62
- nodeMaterial.colorNode = colorNode;
91
+ nodeMaterial.colorNode = node;
63
92
  nodeMaterial.side = BackSide;
64
93
  nodeMaterial.depthTest = false;
65
94
  nodeMaterial.depthWrite = false;
@@ -1,4 +1,5 @@
1
1
  import { GPUIndexFormat, GPUTextureFormat, GPUStoreOp } from './constants.js';
2
+ import WebGPUAnimation from './WebGPUAnimation.js';
2
3
  import WebGPUObjects from './WebGPUObjects.js';
3
4
  import WebGPUAttributes from './WebGPUAttributes.js';
4
5
  import WebGPUGeometries from './WebGPUGeometries.js';
@@ -132,6 +133,8 @@ class WebGPURenderer {
132
133
  this._textures = null;
133
134
  this._background = null;
134
135
 
136
+ this._animation = new WebGPUAnimation();
137
+
135
138
  this._renderPassDescriptor = null;
136
139
 
137
140
  this._currentRenderState = null;
@@ -147,6 +150,8 @@ class WebGPURenderer {
147
150
 
148
151
  this._renderTarget = null;
149
152
 
153
+ this._initialized = false;
154
+
150
155
  // some parameters require default values other than "undefined"
151
156
 
152
157
  this._parameters.antialias = ( parameters.antialias === true );
@@ -168,6 +173,12 @@ class WebGPURenderer {
168
173
 
169
174
  async init() {
170
175
 
176
+ if ( this._initialized === true ) {
177
+
178
+ throw new Error( 'WebGPURenderer: Device has already been initialized.' );
179
+
180
+ }
181
+
171
182
  const parameters = this._parameters;
172
183
 
173
184
  const adapterOptions = {
@@ -192,7 +203,7 @@ class WebGPURenderer {
192
203
  const context = ( parameters.context !== undefined ) ? parameters.context : this.domElement.getContext( 'webgpu' );
193
204
 
194
205
  context.configure( {
195
- device: device,
206
+ device,
196
207
  format: GPUTextureFormat.BGRA8Unorm, // this is the only valid context format right now (r121)
197
208
  alphaMode: 'premultiplied'
198
209
  } );
@@ -232,16 +243,21 @@ class WebGPURenderer {
232
243
  this._setupColorBuffer();
233
244
  this._setupDepthBuffer();
234
245
 
235
- }
246
+ this._animation.setNodes( this._nodes );
247
+ this._animation.start();
248
+
249
+ this._initialized = true;
236
250
 
237
- render( scene, camera ) {
251
+ }
238
252
 
239
- // @TODO: move this to animation loop
253
+ async render( scene, camera ) {
240
254
 
241
- this._nodes.updateFrame();
255
+ if ( this._initialized === false ) return await this.init();
242
256
 
243
257
  //
244
258
 
259
+ if ( this._animation.isAnimating === false ) this._nodes.updateFrame();
260
+
245
261
  if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
246
262
 
247
263
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
@@ -276,6 +292,8 @@ class WebGPURenderer {
276
292
 
277
293
  if ( renderTarget !== null ) {
278
294
 
295
+ this._textures.initRenderTarget( renderTarget );
296
+
279
297
  // @TODO: Support RenderTarget with antialiasing.
280
298
 
281
299
  const renderTargetProperties = this._properties.get( renderTarget );
@@ -354,6 +372,24 @@ class WebGPURenderer {
354
372
 
355
373
  }
356
374
 
375
+ setAnimationLoop( callback ) {
376
+
377
+ if ( this._initialized === false ) this.init();
378
+
379
+ const animation = this._animation;
380
+
381
+ animation.setAnimationLoop( callback );
382
+
383
+ ( callback === null ) ? animation.stop() : animation.start();
384
+
385
+ }
386
+
387
+ async getArrayFromBuffer( attribute ) {
388
+
389
+ return await this._attributes.getArrayBuffer( attribute );
390
+
391
+ }
392
+
357
393
  getContext() {
358
394
 
359
395
  return this._context;
@@ -571,21 +607,20 @@ class WebGPURenderer {
571
607
  this._renderStates.dispose();
572
608
  this._textures.dispose();
573
609
 
610
+ this.setRenderTarget( null );
611
+ this.setAnimationLoop( null );
612
+
574
613
  }
575
614
 
576
615
  setRenderTarget( renderTarget ) {
577
616
 
578
617
  this._renderTarget = renderTarget;
579
618
 
580
- if ( renderTarget !== null ) {
581
-
582
- this._textures.initRenderTarget( renderTarget );
583
-
584
- }
585
-
586
619
  }
587
620
 
588
- compute( ...computeNodes ) {
621
+ async compute( ...computeNodes ) {
622
+
623
+ if ( this._initialized === false ) return await this.init();
589
624
 
590
625
  const device = this._device;
591
626
  const computePipelines = this._computePipelines;
@@ -57,28 +57,30 @@ const wgslTypeLib = {
57
57
  const wgslMethods = {
58
58
  dFdx: 'dpdx',
59
59
  dFdy: 'dpdy',
60
+ mod: 'threejs_mod',
61
+ lessThanEqual: 'threejs_lessThanEqual',
60
62
  inversesqrt: 'inverseSqrt'
61
63
  };
62
64
 
63
65
  const wgslPolyfill = {
64
66
  lessThanEqual: new CodeNode( `
65
- fn lessThanEqual( a : vec3<f32>, b : vec3<f32> ) -> vec3<bool> {
67
+ fn threejs_lessThanEqual( a : vec3<f32>, b : vec3<f32> ) -> vec3<bool> {
66
68
 
67
69
  return vec3<bool>( a.x <= b.x, a.y <= b.y, a.z <= b.z );
68
70
 
69
71
  }
70
72
  ` ),
71
73
  mod: new CodeNode( `
72
- fn mod( x : f32, y : f32 ) -> f32 {
74
+ fn threejs_mod( x : f32, y : f32 ) -> f32 {
73
75
 
74
76
  return x - y * floor( x / y );
75
77
 
76
78
  }
77
79
  ` ),
78
80
  repeatWrapping: new CodeNode( `
79
- fn repeatWrapping( uv : vec2<f32>, dimension : vec2<i32> ) -> vec2<i32> {
81
+ fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32> {
80
82
 
81
- let uvScaled = vec2<i32>( uv * vec2<f32>( dimension ) );
83
+ let uvScaled = vec2<u32>( uv * vec2<f32>( dimension ) );
82
84
 
83
85
  return ( ( uvScaled % dimension ) + dimension ) % dimension;
84
86
 
@@ -148,7 +150,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
148
150
 
149
151
  const dimension = `textureDimensions( ${textureProperty}, 0 )`;
150
152
 
151
- return `textureLoad( ${textureProperty}, repeatWrapping( ${uvSnippet}, ${dimension} ), 0 )`;
153
+ return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), 0 )`;
152
154
 
153
155
  }
154
156
 
@@ -166,7 +168,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
166
168
 
167
169
  const dimension = `textureDimensions( ${textureProperty}, 0 )`;
168
170
 
169
- return `textureLoad( ${textureProperty}, repeatWrapping( ${uvSnippet}, ${dimension} ), i32( ${biasSnippet} ) )`;
171
+ return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), i32( ${biasSnippet} ) )`;
170
172
 
171
173
  }
172
174
 
@@ -198,7 +200,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
198
200
 
199
201
  getPropertyName( node, shaderStage = this.shaderStage ) {
200
202
 
201
- if ( node.isNodeVarying === true ) {
203
+ if ( node.isNodeVarying === true && node.needsInterpolation === true ) {
202
204
 
203
205
  if ( shaderStage === 'vertex' ) {
204
206
 
@@ -397,6 +399,18 @@ class WebGPUNodeBuilder extends NodeBuilder {
397
399
 
398
400
  }
399
401
 
402
+ getFragCoord() {
403
+
404
+ return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>', 'fragment' );
405
+
406
+ }
407
+
408
+ isFlipY() {
409
+
410
+ return false;
411
+
412
+ }
413
+
400
414
  getAttributes( shaderStage ) {
401
415
 
402
416
  const snippets = [];
@@ -461,24 +475,42 @@ class WebGPUNodeBuilder extends NodeBuilder {
461
475
  this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
462
476
 
463
477
  const varyings = this.varyings;
478
+ const vars = this.vars[ shaderStage ];
464
479
 
465
480
  for ( let index = 0; index < varyings.length; index ++ ) {
466
481
 
467
482
  const varying = varyings[ index ];
468
483
 
469
- snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
484
+ if ( varying.needsInterpolation ) {
485
+
486
+ snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
487
+
488
+ } else if ( vars.includes( varying ) === false ) {
489
+
490
+ vars.push( varying );
491
+
492
+ }
470
493
 
471
494
  }
472
495
 
473
496
  } else if ( shaderStage === 'fragment' ) {
474
497
 
475
498
  const varyings = this.varyings;
499
+ const vars = this.vars[ shaderStage ];
476
500
 
477
501
  for ( let index = 0; index < varyings.length; index ++ ) {
478
502
 
479
503
  const varying = varyings[ index ];
480
504
 
481
- snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
505
+ if ( varying.needsInterpolation ) {
506
+
507
+ snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
508
+
509
+ } else if ( vars.includes( varying ) === false ) {
510
+
511
+ vars.push( varying );
512
+
513
+ }
482
514
 
483
515
  }
484
516
 
@@ -45,8 +45,6 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in Geometric
45
45
 
46
46
  #define RE_Direct RE_Direct_BlinnPhong
47
47
  #define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong
48
-
49
- #define Material_LightProbeLOD( material ) (0)
50
48
  `;
51
49
 
52
50
  const mmd_toon_matcap_fragment = /* glsl */`