super-three 0.171.0 → 0.173.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 (455) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/build/three.cjs +594 -427
  4. package/build/three.core.js +515 -81
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +79 -350
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +20 -7
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +29362 -3427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +29361 -3427
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -5
  15. package/examples/jsm/animation/CCDIKSolver.js +9 -7
  16. package/examples/jsm/capabilities/WebGPU.js +1 -1
  17. package/examples/jsm/controls/ArcballControls.js +48 -37
  18. package/examples/jsm/controls/OrbitControls.js +5 -4
  19. package/examples/jsm/csm/CSMShadowNode.js +16 -11
  20. package/examples/jsm/curves/NURBSCurve.js +1 -1
  21. package/examples/jsm/curves/NURBSUtils.js +3 -0
  22. package/examples/jsm/effects/OutlineEffect.js +1 -1
  23. package/examples/jsm/exporters/GLTFExporter.js +34 -29
  24. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  25. package/examples/jsm/exporters/PLYExporter.js +2 -2
  26. package/examples/jsm/geometries/TextGeometry.js +1 -12
  27. package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
  28. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  29. package/examples/jsm/interactive/InteractiveGroup.js +108 -51
  30. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  31. package/examples/jsm/lights/LightProbeGenerator.js +3 -3
  32. package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
  33. package/examples/jsm/loaders/3MFLoader.js +6 -3
  34. package/examples/jsm/loaders/BVHLoader.js +1 -1
  35. package/examples/jsm/loaders/ColladaLoader.js +5 -5
  36. package/examples/jsm/loaders/DDSLoader.js +42 -0
  37. package/examples/jsm/loaders/GCodeLoader.js +4 -2
  38. package/examples/jsm/loaders/GLTFLoader.js +22 -4
  39. package/examples/jsm/loaders/KTX2Loader.js +6 -1
  40. package/examples/jsm/loaders/KTXLoader.js +4 -4
  41. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  42. package/examples/jsm/loaders/LottieLoader.js +1 -1
  43. package/examples/jsm/loaders/MTLLoader.js +1 -0
  44. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  45. package/examples/jsm/loaders/PLYLoader.js +7 -7
  46. package/examples/jsm/loaders/PVRLoader.js +1 -1
  47. package/examples/jsm/loaders/SVGLoader.js +2 -2
  48. package/examples/jsm/loaders/TDSLoader.js +1 -2
  49. package/examples/jsm/loaders/VRMLLoader.js +7 -7
  50. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  51. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
  52. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  53. package/examples/jsm/math/ConvexHull.js +1 -1
  54. package/examples/jsm/math/OBB.js +17 -0
  55. package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
  56. package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
  57. package/examples/jsm/misc/ProgressiveLightMapGPU.js +14 -13
  58. package/examples/jsm/misc/Volume.js +27 -17
  59. package/examples/jsm/misc/VolumeSlice.js +7 -5
  60. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  61. package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
  62. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  63. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  64. package/examples/jsm/objects/Sky.js +2 -2
  65. package/examples/jsm/objects/SkyMesh.js +3 -3
  66. package/examples/jsm/objects/Water2.js +1 -1
  67. package/examples/jsm/objects/Water2Mesh.js +2 -2
  68. package/examples/jsm/objects/WaterMesh.js +29 -24
  69. package/examples/jsm/physics/JoltPhysics.js +7 -7
  70. package/examples/jsm/physics/RapierPhysics.js +4 -4
  71. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  72. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  73. package/examples/jsm/postprocessing/OutlinePass.js +4 -4
  74. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  75. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  76. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  77. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  78. package/examples/jsm/postprocessing/SSRPass.js +2 -4
  79. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  80. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  81. package/examples/jsm/shaders/BokehShader2.js +1 -1
  82. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  83. package/examples/jsm/shaders/OutputShader.js +5 -1
  84. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  85. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  86. package/examples/jsm/transpiler/TSLEncoder.js +2 -0
  87. package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
  88. package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
  89. package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
  90. package/examples/jsm/tsl/display/BleachBypass.js +10 -0
  91. package/examples/jsm/tsl/display/BloomNode.js +233 -26
  92. package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
  93. package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
  94. package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
  95. package/examples/jsm/tsl/display/FXAANode.js +52 -3
  96. package/examples/jsm/tsl/display/FilmNode.js +47 -1
  97. package/examples/jsm/tsl/display/GTAONode.js +210 -14
  98. package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
  99. package/examples/jsm/tsl/display/LensflareNode.js +131 -13
  100. package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
  101. package/examples/jsm/tsl/display/MotionBlur.js +12 -2
  102. package/examples/jsm/tsl/display/OutlineNode.js +343 -26
  103. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
  104. package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
  105. package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
  106. package/examples/jsm/tsl/display/SMAANode.js +187 -46
  107. package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
  108. package/examples/jsm/tsl/display/SSRNode.js +194 -21
  109. package/examples/jsm/tsl/display/Sepia.js +9 -0
  110. package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
  111. package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
  112. package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
  113. package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
  114. package/examples/jsm/tsl/display/TransitionNode.js +71 -6
  115. package/examples/jsm/tsl/display/hashBlur.js +14 -3
  116. package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
  117. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  118. package/examples/jsm/utils/CameraUtils.js +4 -1
  119. package/examples/jsm/utils/GeometryUtils.js +22 -19
  120. package/examples/jsm/utils/SceneUtils.js +2 -2
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  122. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  123. package/package.json +8 -3
  124. package/src/Three.Core.js +4 -0
  125. package/src/Three.Legacy.js +0 -21
  126. package/src/Three.TSL.js +18 -5
  127. package/src/Three.WebGPU.Nodes.js +2 -2
  128. package/src/Three.WebGPU.js +2 -2
  129. package/src/animation/PropertyBinding.js +2 -2
  130. package/src/cameras/ArrayCamera.js +1 -0
  131. package/src/cameras/PerspectiveCamera.js +18 -2
  132. package/src/constants.js +6 -1
  133. package/src/core/BufferAttribute.js +4 -0
  134. package/src/core/EventDispatcher.js +8 -6
  135. package/src/core/RenderTarget.js +18 -0
  136. package/src/core/RenderTarget3D.js +22 -0
  137. package/src/core/RenderTargetArray.js +22 -0
  138. package/src/extras/Earcut.js +1 -1
  139. package/src/extras/ImageUtils.js +1 -11
  140. package/src/extras/PMREMGenerator.js +20 -0
  141. package/src/extras/TextureUtils.js +6 -0
  142. package/src/helpers/CameraHelper.js +16 -13
  143. package/src/loaders/nodes/NodeLoader.js +59 -0
  144. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  145. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  146. package/src/materials/nodes/Line2NodeMaterial.js +128 -34
  147. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  148. package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
  149. package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
  150. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  151. package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
  152. package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
  153. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  154. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
  155. package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
  156. package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
  157. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  158. package/src/materials/nodes/NodeMaterial.js +476 -23
  159. package/src/materials/nodes/NodeMaterials.js +0 -1
  160. package/src/materials/nodes/PointsNodeMaterial.js +121 -10
  161. package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
  162. package/src/materials/nodes/SpriteNodeMaterial.js +78 -20
  163. package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
  164. package/src/materials/nodes/manager/NodeMaterialObserver.js +95 -0
  165. package/src/nodes/Nodes.js +5 -6
  166. package/src/nodes/TSL.js +6 -3
  167. package/src/nodes/accessors/AccessorsUtils.js +27 -0
  168. package/src/nodes/accessors/Arrays.js +47 -6
  169. package/src/nodes/accessors/BatchNode.js +42 -6
  170. package/src/nodes/accessors/Bitangent.js +37 -0
  171. package/src/nodes/accessors/BufferAttributeNode.js +178 -5
  172. package/src/nodes/accessors/BufferNode.js +63 -0
  173. package/src/nodes/accessors/BuiltinNode.js +38 -0
  174. package/src/nodes/accessors/Camera.js +113 -3
  175. package/src/nodes/accessors/ClippingNode.js +71 -2
  176. package/src/nodes/accessors/CubeTextureNode.js +64 -0
  177. package/src/nodes/accessors/InstanceNode.js +85 -2
  178. package/src/nodes/accessors/InstancedMeshNode.js +28 -3
  179. package/src/nodes/accessors/Lights.js +50 -1
  180. package/src/nodes/accessors/MaterialNode.js +306 -12
  181. package/src/nodes/accessors/MaterialProperties.js +7 -0
  182. package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
  183. package/src/nodes/accessors/ModelNode.js +100 -5
  184. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
  185. package/src/nodes/accessors/MorphNode.js +48 -4
  186. package/src/nodes/accessors/Normal.js +65 -5
  187. package/src/nodes/accessors/Object3DNode.js +101 -1
  188. package/src/nodes/accessors/PointUVNode.js +26 -0
  189. package/src/nodes/accessors/Position.js +56 -7
  190. package/src/nodes/accessors/ReferenceBaseNode.js +186 -0
  191. package/src/nodes/accessors/ReferenceNode.js +201 -2
  192. package/src/nodes/accessors/ReflectVector.js +24 -0
  193. package/src/nodes/accessors/RendererReferenceNode.js +46 -1
  194. package/src/nodes/accessors/SceneNode.js +54 -0
  195. package/src/nodes/accessors/SkinningNode.js +127 -1
  196. package/src/nodes/accessors/StorageBufferNode.js +209 -8
  197. package/src/nodes/accessors/StorageTextureNode.js +118 -0
  198. package/src/nodes/accessors/Tangent.js +38 -2
  199. package/src/nodes/accessors/Texture3DNode.js +91 -7
  200. package/src/nodes/accessors/TextureBicubic.js +12 -2
  201. package/src/nodes/accessors/TextureNode.js +316 -10
  202. package/src/nodes/accessors/TextureSizeNode.js +42 -0
  203. package/src/nodes/accessors/UV.js +10 -1
  204. package/src/nodes/accessors/UniformArrayNode.js +231 -25
  205. package/src/nodes/accessors/UserDataNode.js +46 -0
  206. package/src/nodes/accessors/VelocityNode.js +80 -0
  207. package/src/nodes/accessors/VertexColorNode.js +39 -2
  208. package/src/nodes/code/CodeNode.js +95 -1
  209. package/src/nodes/code/ExpressionNode.js +28 -0
  210. package/src/nodes/code/FunctionCallNode.js +37 -0
  211. package/src/nodes/code/FunctionNode.js +45 -0
  212. package/src/nodes/code/ScriptableNode.js +223 -1
  213. package/src/nodes/code/ScriptableValueNode.js +85 -1
  214. package/src/nodes/core/ArrayNode.js +125 -0
  215. package/src/nodes/core/AssignNode.js +48 -2
  216. package/src/nodes/core/AttributeNode.js +43 -0
  217. package/src/nodes/core/BypassNode.js +47 -2
  218. package/src/nodes/core/CacheNode.js +53 -2
  219. package/src/nodes/core/ConstNode.js +32 -0
  220. package/src/nodes/core/ContextNode.js +65 -0
  221. package/src/nodes/core/IndexNode.js +68 -7
  222. package/src/nodes/core/InputNode.js +48 -0
  223. package/src/nodes/core/LightingModel.js +60 -0
  224. package/src/nodes/core/MRTNode.js +66 -0
  225. package/src/nodes/core/Node.js +350 -12
  226. package/src/nodes/core/NodeAttribute.js +38 -0
  227. package/src/nodes/core/NodeBuilder.js +1166 -26
  228. package/src/nodes/core/NodeCache.js +41 -2
  229. package/src/nodes/core/NodeCode.js +31 -0
  230. package/src/nodes/core/NodeFrame.js +123 -2
  231. package/src/nodes/core/NodeFunction.js +46 -0
  232. package/src/nodes/core/NodeFunctionInput.js +44 -0
  233. package/src/nodes/core/NodeParser.js +11 -0
  234. package/src/nodes/core/NodeUniform.js +52 -0
  235. package/src/nodes/core/NodeUtils.js +152 -1
  236. package/src/nodes/core/NodeVar.js +47 -1
  237. package/src/nodes/core/NodeVarying.js +28 -0
  238. package/src/nodes/core/OutputStructNode.js +51 -10
  239. package/src/nodes/core/ParameterNode.js +28 -0
  240. package/src/nodes/core/PropertyNode.js +232 -0
  241. package/src/nodes/core/StackNode.js +98 -1
  242. package/src/nodes/core/StructNode.js +121 -0
  243. package/src/nodes/core/StructType.js +13 -0
  244. package/src/nodes/core/StructTypeNode.js +105 -6
  245. package/src/nodes/core/TempNode.js +31 -5
  246. package/src/nodes/core/UniformGroupNode.js +82 -7
  247. package/src/nodes/core/UniformNode.js +66 -0
  248. package/src/nodes/core/VarNode.js +146 -7
  249. package/src/nodes/core/VaryingNode.js +100 -3
  250. package/src/nodes/core/constants.js +36 -0
  251. package/src/nodes/display/BlendModes.js +88 -1
  252. package/src/nodes/display/BumpMapNode.js +37 -0
  253. package/src/nodes/display/ColorAdjustment.js +53 -11
  254. package/src/nodes/display/ColorSpaceFunctions.js +16 -0
  255. package/src/nodes/display/ColorSpaceNode.js +82 -0
  256. package/src/nodes/display/FrontFacingNode.js +29 -0
  257. package/src/nodes/display/NormalMapNode.js +43 -0
  258. package/src/nodes/display/PassNode.js +300 -7
  259. package/src/nodes/display/PosterizeNode.js +33 -0
  260. package/src/nodes/display/RenderOutputNode.js +66 -1
  261. package/src/nodes/display/ScreenNode.js +96 -0
  262. package/src/nodes/display/ToneMappingFunctions.js +58 -10
  263. package/src/nodes/display/ToneMappingNode.js +55 -2
  264. package/src/nodes/display/ToonOutlinePassNode.js +73 -0
  265. package/src/nodes/display/ViewportDepthNode.js +122 -8
  266. package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
  267. package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
  268. package/src/nodes/display/ViewportTextureNode.js +57 -0
  269. package/src/nodes/fog/Fog.js +110 -0
  270. package/src/nodes/functions/BasicLightingModel.js +24 -0
  271. package/src/nodes/functions/PhongLightingModel.js +34 -2
  272. package/src/nodes/functions/PhysicalLightingModel.js +167 -8
  273. package/src/nodes/functions/ShadowMaskModel.js +23 -0
  274. package/src/nodes/functions/ToonLightingModel.js +20 -0
  275. package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
  276. package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
  277. package/src/nodes/geometry/RangeNode.js +54 -2
  278. package/src/nodes/gpgpu/AtomicFunctionNode.js +174 -2
  279. package/src/nodes/gpgpu/BarrierNode.js +47 -0
  280. package/src/nodes/gpgpu/ComputeBuiltinNode.js +134 -0
  281. package/src/nodes/gpgpu/ComputeNode.js +106 -2
  282. package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
  283. package/src/nodes/lighting/AONode.js +18 -0
  284. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  285. package/src/nodes/lighting/AnalyticLightNode.js +97 -2
  286. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  287. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  288. package/src/nodes/lighting/DirectionalLightNode.js +10 -0
  289. package/src/nodes/lighting/EnvironmentNode.js +18 -0
  290. package/src/nodes/lighting/HemisphereLightNode.js +31 -0
  291. package/src/nodes/lighting/IESSpotLightNode.js +11 -0
  292. package/src/nodes/lighting/IrradianceNode.js +17 -0
  293. package/src/nodes/lighting/LightProbeNode.js +20 -0
  294. package/src/nodes/lighting/LightUtils.js +12 -0
  295. package/src/nodes/lighting/LightingContextNode.js +48 -0
  296. package/src/nodes/lighting/LightingNode.js +15 -6
  297. package/src/nodes/lighting/LightsNode.js +132 -1
  298. package/src/nodes/lighting/PointLightNode.js +32 -1
  299. package/src/nodes/lighting/PointShadowNode.js +54 -1
  300. package/src/nodes/lighting/RectAreaLightNode.js +44 -6
  301. package/src/nodes/lighting/ShadowBaseNode.js +93 -0
  302. package/src/nodes/lighting/ShadowNode.js +241 -35
  303. package/src/nodes/lighting/SpotLightNode.js +43 -0
  304. package/src/nodes/math/ConditionalNode.js +78 -4
  305. package/src/nodes/math/Hash.js +9 -0
  306. package/src/nodes/math/MathNode.js +627 -11
  307. package/src/nodes/math/MathUtils.js +45 -1
  308. package/src/nodes/math/OperatorNode.js +329 -18
  309. package/src/nodes/math/TriNoise3D.js +18 -7
  310. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  311. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  312. package/src/nodes/pmrem/PMREMNode.js +133 -0
  313. package/src/nodes/pmrem/PMREMUtils.js +2 -2
  314. package/src/nodes/procedural/Checker.js +9 -0
  315. package/src/nodes/shapes/Shapes.js +33 -0
  316. package/src/nodes/tsl/TSLBase.js +3 -2
  317. package/src/nodes/tsl/TSLCore.js +22 -2
  318. package/src/nodes/utils/ArrayElementNode.js +39 -3
  319. package/src/nodes/utils/ConvertNode.js +31 -0
  320. package/src/nodes/utils/CubeMapNode.js +78 -0
  321. package/src/nodes/utils/Discard.js +16 -0
  322. package/src/nodes/utils/EquirectUVNode.js +31 -1
  323. package/src/nodes/utils/FlipNode.js +38 -0
  324. package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
  325. package/src/nodes/utils/JoinNode.js +25 -0
  326. package/src/nodes/utils/LoopNode.js +82 -2
  327. package/src/nodes/utils/MatcapUVNode.js +17 -0
  328. package/src/nodes/utils/MaxMipLevelNode.js +49 -0
  329. package/src/nodes/utils/MemberNode.js +68 -0
  330. package/src/nodes/utils/Oscillators.js +33 -0
  331. package/src/nodes/utils/Packing.js +17 -0
  332. package/src/nodes/utils/PostProcessingUtils.js +28 -23
  333. package/src/nodes/utils/RTTNode.js +123 -2
  334. package/src/nodes/utils/ReflectorNode.js +174 -4
  335. package/src/nodes/utils/RemapNode.js +79 -0
  336. package/src/nodes/utils/RotateNode.js +41 -0
  337. package/src/nodes/utils/SetNode.js +44 -1
  338. package/src/nodes/utils/SplitNode.js +55 -3
  339. package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
  340. package/src/nodes/utils/SpriteUtils.js +17 -0
  341. package/src/nodes/utils/StorageArrayElementNode.js +54 -0
  342. package/src/nodes/utils/Timer.js +40 -0
  343. package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
  344. package/src/nodes/utils/UVUtils.js +20 -0
  345. package/src/nodes/utils/ViewportUtils.js +13 -0
  346. package/src/objects/BatchedMesh.js +2 -3
  347. package/src/objects/ClippingGroup.js +49 -0
  348. package/src/objects/Line.js +6 -6
  349. package/src/renderers/WebGLRenderer.js +30 -4
  350. package/src/renderers/common/Animation.js +85 -0
  351. package/src/renderers/common/Attributes.js +36 -0
  352. package/src/renderers/common/Backend.js +502 -44
  353. package/src/renderers/common/Background.js +48 -1
  354. package/src/renderers/common/BindGroup.js +43 -0
  355. package/src/renderers/common/Binding.js +35 -0
  356. package/src/renderers/common/Bindings.js +93 -1
  357. package/src/renderers/common/Buffer.js +49 -0
  358. package/src/renderers/common/BufferUtils.js +27 -0
  359. package/src/renderers/common/BundleGroup.js +57 -0
  360. package/src/renderers/common/ChainMap.js +45 -6
  361. package/src/renderers/common/ClippingContext.js +108 -15
  362. package/src/renderers/common/Color4.js +40 -0
  363. package/src/renderers/common/ComputePipeline.js +24 -0
  364. package/src/renderers/common/CubeRenderTarget.js +13 -0
  365. package/src/renderers/common/DataMap.js +37 -1
  366. package/src/renderers/common/Geometries.js +91 -14
  367. package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
  368. package/src/renderers/common/Info.js +78 -35
  369. package/src/renderers/common/Lighting.js +34 -6
  370. package/src/renderers/common/Pipeline.js +22 -0
  371. package/src/renderers/common/Pipelines.js +148 -5
  372. package/src/renderers/common/PostProcessing.js +99 -11
  373. package/src/renderers/common/ProgrammableStage.js +60 -2
  374. package/src/renderers/common/QuadMesh.js +54 -5
  375. package/src/renderers/common/RenderBundle.js +14 -8
  376. package/src/renderers/common/RenderBundles.js +39 -10
  377. package/src/renderers/common/RenderContext.js +201 -2
  378. package/src/renderers/common/RenderContexts.js +59 -6
  379. package/src/renderers/common/RenderList.js +178 -0
  380. package/src/renderers/common/RenderLists.js +40 -3
  381. package/src/renderers/common/RenderObject.js +400 -17
  382. package/src/renderers/common/RenderObjects.js +103 -7
  383. package/src/renderers/common/RenderPipeline.js +24 -0
  384. package/src/renderers/common/Renderer.js +1170 -86
  385. package/src/renderers/common/RendererUtils.js +193 -0
  386. package/src/renderers/common/SampledTexture.js +120 -0
  387. package/src/renderers/common/Sampler.js +30 -0
  388. package/src/renderers/common/StorageBuffer.js +24 -0
  389. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  390. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  391. package/src/renderers/common/StorageTexture.js +38 -0
  392. package/src/renderers/common/Textures.js +97 -7
  393. package/src/renderers/common/TimestampQueryPool.js +39 -0
  394. package/src/renderers/common/Uniform.js +225 -3
  395. package/src/renderers/common/UniformBuffer.js +19 -0
  396. package/src/renderers/common/UniformsGroup.js +141 -2
  397. package/src/renderers/common/XRManager.js +1193 -0
  398. package/src/renderers/common/XRRenderTarget.js +74 -0
  399. package/src/renderers/common/extras/PMREMGenerator.js +76 -10
  400. package/src/renderers/common/nodes/NodeBuilderState.js +99 -5
  401. package/src/renderers/common/nodes/NodeLibrary.js +89 -0
  402. package/src/renderers/common/nodes/NodeSampledTexture.js +90 -2
  403. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  404. package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
  405. package/src/renderers/common/nodes/NodeUniform.js +243 -2
  406. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  407. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  408. package/src/renderers/common/nodes/Nodes.js +352 -78
  409. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  410. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  411. package/src/renderers/webgl/WebGLBackground.js +4 -0
  412. package/src/renderers/webgl-fallback/WebGLBackend.js +819 -116
  413. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -18
  414. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +58 -1
  415. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  416. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  417. package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
  418. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +168 -22
  419. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
  420. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
  421. package/src/renderers/webgpu/WebGPUBackend.js +578 -164
  422. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +36 -0
  423. package/src/renderers/webgpu/WebGPURenderer.js +36 -0
  424. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
  425. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
  426. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +674 -52
  427. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
  428. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  429. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +95 -14
  430. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +94 -1
  431. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
  432. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
  433. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +262 -18
  434. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
  435. package/src/renderers/webgpu/utils/WebGPUUtils.js +116 -4
  436. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  437. package/src/renderers/webxr/WebXRManager.js +19 -2
  438. package/src/textures/Data3DTexture.js +2 -2
  439. package/src/textures/Texture.js +4 -0
  440. package/src/textures/VideoFrameTexture.js +35 -0
  441. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
  442. package/examples/jsm/animation/MMDPhysics.js +0 -1408
  443. package/examples/jsm/exporters/MMDExporter.js +0 -223
  444. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
  445. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  446. package/examples/jsm/loaders/MMDLoader.js +0 -2298
  447. package/examples/jsm/objects/InstancedPoints.js +0 -19
  448. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  449. package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
  450. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
  451. package/src/nodes/core/UniformGroup.js +0 -13
  452. package/src/nodes/fog/FogExp2Node.js +0 -35
  453. package/src/nodes/fog/FogNode.js +0 -50
  454. package/src/nodes/fog/FogRangeNode.js +0 -36
  455. package/src/renderers/common/PostProcessingUtils.js +0 -86
@@ -3,7 +3,6 @@
3
3
  export { default as NodeMaterialObserver } from './manager/NodeMaterialObserver.js';
4
4
 
5
5
  export { default as NodeMaterial } from './NodeMaterial.js';
6
- export { default as InstancedPointsNodeMaterial } from './InstancedPointsNodeMaterial.js';
7
6
  export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js';
8
7
  export { default as LineDashedNodeMaterial } from './LineDashedNodeMaterial.js';
9
8
  export { default as Line2NodeMaterial } from './Line2NodeMaterial.js';
@@ -1,10 +1,21 @@
1
- import NodeMaterial from './NodeMaterial.js';
1
+ import SpriteNodeMaterial from './SpriteNodeMaterial.js';
2
+ import { viewport } from '../../nodes/display/ScreenNode.js';
3
+ import { positionGeometry, positionLocal, positionView } from '../../nodes/accessors/Position.js';
4
+ import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
5
+ import { materialPointSize } from '../../nodes/accessors/MaterialNode.js';
6
+ import { rotate } from '../../nodes/utils/RotateNode.js';
7
+ import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
2
8
 
3
9
  import { PointsMaterial } from '../PointsMaterial.js';
4
10
 
5
11
  const _defaultValues = /*@__PURE__*/ new PointsMaterial();
6
12
 
7
- class PointsNodeMaterial extends NodeMaterial {
13
+ /**
14
+ * Node material version of `PointsMaterial`.
15
+ *
16
+ * @augments NodeMaterial
17
+ */
18
+ class PointsNodeMaterial extends SpriteNodeMaterial {
8
19
 
9
20
  static get type() {
10
21
 
@@ -12,28 +23,128 @@ class PointsNodeMaterial extends NodeMaterial {
12
23
 
13
24
  }
14
25
 
26
+ /**
27
+ * Constructs a new points node material.
28
+ *
29
+ * @param {Object?} parameters - The configuration parameter.
30
+ */
15
31
  constructor( parameters ) {
16
32
 
17
33
  super();
18
34
 
19
- this.isPointsNodeMaterial = true;
20
-
21
- this.lights = false;
22
- this.transparent = true;
23
-
35
+ /**
36
+ * This node property provides an additional way to set the point size.
37
+ *
38
+ * @type {Node<vec2>?}
39
+ * @default null
40
+ */
24
41
  this.sizeNode = null;
25
42
 
43
+ /**
44
+ * This flag can be used for type testing.
45
+ *
46
+ * @type {Boolean}
47
+ * @readonly
48
+ * @default true
49
+ */
50
+ this.isPointsNodeMaterial = true;
51
+
26
52
  this.setDefaultValues( _defaultValues );
27
53
 
28
54
  this.setValues( parameters );
29
55
 
30
56
  }
31
57
 
32
- copy( source ) {
58
+ setupPositionView() {
59
+
60
+ const { positionNode } = this;
61
+
62
+ return modelViewMatrix.mul( vec3( positionNode || positionLocal ) ).xyz;
63
+
64
+ }
65
+
66
+ setupVertex( builder ) {
67
+
68
+ const mvp = super.setupVertex( builder );
69
+
70
+ // skip further processing if the material is not a node material
71
+
72
+ if ( builder.material.isNodeMaterial !== true ) {
73
+
74
+ return mvp;
75
+
76
+ }
77
+
78
+ // ndc space
79
+
80
+ const { rotationNode, scaleNode, sizeNode } = this;
81
+
82
+ const alignedPosition = positionGeometry.xy.toVar();
83
+ const aspect = viewport.z.div( viewport.w );
84
+
85
+ // rotation
86
+
87
+ if ( rotationNode && rotationNode.isNode ) {
88
+
89
+ const rotation = float( rotationNode );
90
+
91
+ alignedPosition.assign( rotate( alignedPosition, rotation ) );
92
+
93
+ }
94
+
95
+ // point size
96
+
97
+ let pointSize = sizeNode !== null ? vec2( sizeNode ) : materialPointSize;
98
+
99
+ if ( this.sizeAttenuation === true ) {
100
+
101
+ pointSize = pointSize.mul( pointSize.div( positionView.z.negate() ) );
102
+
103
+ }
104
+
105
+ // scale
106
+
107
+ if ( scaleNode && scaleNode.isNode ) {
108
+
109
+ pointSize = pointSize.mul( vec2( scaleNode ) );
110
+
111
+ }
112
+
113
+ alignedPosition.mulAssign( pointSize.mul( 2 ) );
114
+
115
+ alignedPosition.assign( alignedPosition.div( viewport.z ) );
116
+ alignedPosition.y.assign( alignedPosition.y.mul( aspect ) );
117
+
118
+ // back to clip space
119
+ alignedPosition.assign( alignedPosition.mul( mvp.w ) );
120
+
121
+ //clipPos.xy += offset;
122
+ mvp.addAssign( vec4( alignedPosition, 0, 0 ) );
123
+
124
+ return mvp;
125
+
126
+ }
127
+
128
+ /**
129
+ * Whether alpha to coverage should be used or not.
130
+ *
131
+ * @type {Boolean}
132
+ * @default true
133
+ */
134
+ get alphaToCoverage() {
135
+
136
+ return this._useAlphaToCoverage;
137
+
138
+ }
139
+
140
+ set alphaToCoverage( value ) {
141
+
142
+ if ( this._useAlphaToCoverage !== value ) {
33
143
 
34
- this.sizeNode = source.sizeNode;
144
+ this._useAlphaToCoverage = value;
145
+ this.needsUpdate = true;
35
146
 
36
- return super.copy( source );
147
+ }
37
148
 
38
149
  }
39
150
 
@@ -5,6 +5,11 @@ import { ShadowMaterial } from '../ShadowMaterial.js';
5
5
 
6
6
  const _defaultValues = /*@__PURE__*/ new ShadowMaterial();
7
7
 
8
+ /**
9
+ * Node material version of `ShadowMaterial`.
10
+ *
11
+ * @augments NodeMaterial
12
+ */
8
13
  class ShadowNodeMaterial extends NodeMaterial {
9
14
 
10
15
  static get type() {
@@ -13,12 +18,31 @@ class ShadowNodeMaterial extends NodeMaterial {
13
18
 
14
19
  }
15
20
 
21
+ /**
22
+ * Constructs a new shadow node material.
23
+ *
24
+ * @param {Object?} parameters - The configuration parameter.
25
+ */
16
26
  constructor( parameters ) {
17
27
 
18
28
  super();
19
29
 
30
+ /**
31
+ * This flag can be used for type testing.
32
+ *
33
+ * @type {Boolean}
34
+ * @readonly
35
+ * @default true
36
+ */
20
37
  this.isShadowNodeMaterial = true;
21
38
 
39
+ /**
40
+ * Set to `true` because so it's possible to implement
41
+ * the shadow mask effect.
42
+ *
43
+ * @type {Boolean}
44
+ * @default true
45
+ */
22
46
  this.lights = true;
23
47
 
24
48
  this.setDefaultValues( _defaultValues );
@@ -27,6 +51,11 @@ class ShadowNodeMaterial extends NodeMaterial {
27
51
 
28
52
  }
29
53
 
54
+ /**
55
+ * Setups the lighting model.
56
+ *
57
+ * @return {ShadowMaskModel} The lighting model.
58
+ */
30
59
  setupLightingModel( /*builder*/ ) {
31
60
 
32
61
  return new ShadowMaskModel();
@@ -2,7 +2,7 @@ import NodeMaterial from './NodeMaterial.js';
2
2
  import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
3
3
  import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
4
4
  import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
5
- import { positionLocal } from '../../nodes/accessors/Position.js';
5
+ import { positionGeometry } from '../../nodes/accessors/Position.js';
6
6
  import { rotate } from '../../nodes/utils/RotateNode.js';
7
7
  import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
8
8
 
@@ -11,6 +11,11 @@ import { reference } from '../../nodes/accessors/ReferenceBaseNode.js';
11
11
 
12
12
  const _defaultValues = /*@__PURE__*/ new SpriteMaterial();
13
13
 
14
+ /**
15
+ * Node material version of `SpriteMaterial`.
16
+ *
17
+ * @augments NodeMaterial
18
+ */
14
19
  class SpriteNodeMaterial extends NodeMaterial {
15
20
 
16
21
  static get type() {
@@ -19,17 +24,66 @@ class SpriteNodeMaterial extends NodeMaterial {
19
24
 
20
25
  }
21
26
 
27
+ /**
28
+ * Constructs a new sprite node material.
29
+ *
30
+ * @param {Object?} parameters - The configuration parameter.
31
+ */
22
32
  constructor( parameters ) {
23
33
 
24
34
  super();
25
35
 
36
+ /**
37
+ * This flag can be used for type testing.
38
+ *
39
+ * @type {Boolean}
40
+ * @readonly
41
+ * @default true
42
+ */
26
43
  this.isSpriteNodeMaterial = true;
27
44
 
28
- this.lights = false;
29
45
  this._useSizeAttenuation = true;
30
46
 
47
+ /**
48
+ * This property makes it possible to define the position of the sprite with a
49
+ * node. That can be useful when the material is used with instanced rendering
50
+ * and node data are defined with an instanced attribute node:
51
+ * ```js
52
+ * const positionAttribute = new InstancedBufferAttribute( new Float32Array( positions ), 3 );
53
+ * material.positionNode = instancedBufferAttribute( positionAttribute );
54
+ * ```
55
+ * Another possibility is to compute the instanced data with a compute shader:
56
+ * ```js
57
+ * const positionBuffer = instancedArray( particleCount, 'vec3' );
58
+ * particleMaterial.positionNode = positionBuffer.toAttribute();
59
+ * ```
60
+ *
61
+ * @type {Node<vec2>?}
62
+ * @default null
63
+ */
31
64
  this.positionNode = null;
65
+
66
+ /**
67
+ * The rotation of sprite materials is by default inferred from the `rotation`,
68
+ * property. This node property allows to overwrite the default and define
69
+ * the rotation with a node instead.
70
+ *
71
+ * If you don't want to overwrite the rotation but modify the existing
72
+ * value instead, use {@link module:MaterialNode.materialRotation}.
73
+ *
74
+ * @type {Node<float>?}
75
+ * @default null
76
+ */
32
77
  this.rotationNode = null;
78
+
79
+ /**
80
+ * This node property provides an additional way to scale sprites next to
81
+ * `Object3D.scale`. The scale transformation based in `Object3D.scale`
82
+ * is multiplied with the scale value of this node in the vertex shader.
83
+ *
84
+ * @type {Node<vec2>?}
85
+ * @default null
86
+ */
33
87
  this.scaleNode = null;
34
88
 
35
89
  this.setDefaultValues( _defaultValues );
@@ -38,28 +92,32 @@ class SpriteNodeMaterial extends NodeMaterial {
38
92
 
39
93
  }
40
94
 
41
- setupPosition( { object, camera, context } ) {
95
+ /**
96
+ * Setups the position node in view space. This method implements
97
+ * the sprite specific vertex shader.
98
+ *
99
+ * @param {NodeBuilder} builder - The current node builder.
100
+ * @return {Node<vec3>} The position in view space.
101
+ */
102
+ setupPositionView( builder ) {
42
103
 
43
- const sizeAttenuation = this.sizeAttenuation;
104
+ const { object, camera } = builder;
44
105
 
45
- // < VERTEX STAGE >
106
+ const sizeAttenuation = this.sizeAttenuation;
46
107
 
47
108
  const { positionNode, rotationNode, scaleNode } = this;
48
109
 
49
- const vertex = positionLocal;
50
-
51
- let mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );
110
+ const mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );
52
111
 
53
112
  let scale = vec2( modelWorldMatrix[ 0 ].xyz.length(), modelWorldMatrix[ 1 ].xyz.length() );
54
113
 
55
114
  if ( scaleNode !== null ) {
56
115
 
57
- scale = scale.mul( scaleNode );
116
+ scale = scale.mul( float( scaleNode ) );
58
117
 
59
118
  }
60
119
 
61
-
62
- if ( ! sizeAttenuation ) {
120
+ if ( sizeAttenuation === false ) {
63
121
 
64
122
  if ( camera.isPerspectiveCamera ) {
65
123
 
@@ -74,11 +132,11 @@ class SpriteNodeMaterial extends NodeMaterial {
74
132
 
75
133
  }
76
134
 
77
- let alignedPosition = vertex.xy;
135
+ let alignedPosition = positionGeometry.xy;
78
136
 
79
137
  if ( object.center && object.center.isVector2 === true ) {
80
138
 
81
- const center = reference( 'center', 'vec2' );
139
+ const center = reference( 'center', 'vec2', object );
82
140
 
83
141
  alignedPosition = alignedPosition.sub( center.sub( 0.5 ) );
84
142
 
@@ -90,13 +148,7 @@ class SpriteNodeMaterial extends NodeMaterial {
90
148
 
91
149
  const rotatedPosition = rotate( alignedPosition, rotation );
92
150
 
93
- mvPosition = vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );
94
-
95
- const modelViewProjection = cameraProjectionMatrix.mul( mvPosition );
96
-
97
- context.vertex = vertex;
98
-
99
- return modelViewProjection;
151
+ return vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );
100
152
 
101
153
  }
102
154
 
@@ -110,6 +162,12 @@ class SpriteNodeMaterial extends NodeMaterial {
110
162
 
111
163
  }
112
164
 
165
+ /**
166
+ * Whether to use size attenuation or not.
167
+ *
168
+ * @type {Boolean}
169
+ * @default true
170
+ */
113
171
  get sizeAttenuation() {
114
172
 
115
173
  return this._useSizeAttenuation;
@@ -8,7 +8,16 @@ import { Fn, varying, float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js
8
8
  import { min, max } from '../../nodes/math/MathNode.js';
9
9
  import { Loop, Break } from '../../nodes/utils/LoopNode.js';
10
10
  import { texture3D } from '../../nodes/accessors/Texture3DNode.js';
11
+ import { Color } from '../../math/Color.js';
11
12
 
13
+ /** @module VolumeNodeMaterial **/
14
+
15
+ /**
16
+ * Node material intended for volume rendering. The volumetric data are
17
+ * defined with an instance of {@link Data3DTexture}.
18
+ *
19
+ * @augments NodeMaterial
20
+ */
12
21
  class VolumeNodeMaterial extends NodeMaterial {
13
22
 
14
23
  static get type() {
@@ -17,18 +26,85 @@ class VolumeNodeMaterial extends NodeMaterial {
17
26
 
18
27
  }
19
28
 
20
- constructor( params = {} ) {
29
+ /**
30
+ * Constructs a new volume node material.
31
+ *
32
+ * @param {Object?} parameters - The configuration parameter.
33
+ */
34
+ constructor( parameters ) {
21
35
 
22
36
  super();
23
37
 
24
- this.lights = false;
38
+ /**
39
+ * This flag can be used for type testing.
40
+ *
41
+ * @type {Boolean}
42
+ * @readonly
43
+ * @default true
44
+ */
25
45
  this.isVolumeNodeMaterial = true;
46
+
47
+ /**
48
+ * The base color of the volume.
49
+ *
50
+ * @type {Color}
51
+ * @default 100
52
+ */
53
+ this.base = new Color( 0xffffff );
54
+
55
+ /**
56
+ * A 3D data texture holding the volumetric data.
57
+ *
58
+ * @type {Data3DTexture?}
59
+ * @default null
60
+ */
61
+ this.map = null;
62
+
63
+ /**
64
+ * This number of samples for each ray that hits the mesh's surface
65
+ * and travels through the volume.
66
+ *
67
+ * @type {Number}
68
+ * @default 100
69
+ */
70
+ this.steps = 100;
71
+
72
+ /**
73
+ * Callback for {@link VolumeNodeMaterial#testNode}.
74
+ *
75
+ * @callback testNodeCallback
76
+ * @param {Data3DTexture<float>} map - The 3D texture.
77
+ * @param {Node<float>} mapValue - The sampled value inside the volume.
78
+ * @param {Node<vec3>} probe - The probe which is the entry point of the ray on the mesh's surface.
79
+ * @param {Node<vec4>} finalColor - The final color.
80
+ */
81
+
82
+ /**
83
+ * The volume rendering of this material works by shooting rays
84
+ * from the camera position through each fragment of the mesh's
85
+ * surface and sample the inner volume in a raymarching fashion
86
+ * multiple times.
87
+ *
88
+ * This node can be used to assign a callback function of type `Fn`
89
+ * that will be executed per sample. The callback receives the
90
+ * texture, the sampled texture value as well as position on the surface
91
+ * where the rays enters the volume. The last parameter is a color
92
+ * that allows the callback to determine the final color.
93
+ *
94
+ * @type {testNodeCallback?}
95
+ * @default null
96
+ */
26
97
  this.testNode = null;
27
98
 
28
- this.setValues( params );
99
+ this.setValues( parameters );
29
100
 
30
101
  }
31
102
 
103
+ /**
104
+ * Setups the vertex and fragment stage of this node material.
105
+ *
106
+ * @param {NodeBuilder} builder - The current node builder.
107
+ */
32
108
  setup( builder ) {
33
109
 
34
110
  const map = texture3D( this.map, null, 0 );
@@ -75,7 +151,7 @@ class VolumeNodeMaterial extends NodeMaterial {
75
151
 
76
152
  Loop( { type: 'float', start: bounds.x, end: bounds.y, update: '+= delta' }, () => {
77
153
 
78
- const d = property( 'float', 'd' ).assign( map.uv( p.add( 0.5 ) ).r );
154
+ const d = property( 'float', 'd' ).assign( map.sample( p.add( 0.5 ) ).r );
79
155
 
80
156
  if ( this.testNode !== null ) {
81
157
 
@@ -51,18 +51,65 @@ const refreshUniforms = [
51
51
  'transmissionMap'
52
52
  ];
53
53
 
54
+ /**
55
+ * This class is used by {@link WebGPURenderer} as management component.
56
+ * It's primary purpose is to determine whether render objects require a
57
+ * refresh right before they are going to be rendered or not.
58
+ */
54
59
  class NodeMaterialObserver {
55
60
 
61
+ /**
62
+ * Constructs a new node material observer.
63
+ *
64
+ * @param {NodeBuilder} builder - The node builder.
65
+ */
56
66
  constructor( builder ) {
57
67
 
68
+ /**
69
+ * A node material can be used by more than one render object so the
70
+ * monitor must maintain a list of render objects.
71
+ *
72
+ * @type {WeakMap<RenderObject,Object>}
73
+ */
58
74
  this.renderObjects = new WeakMap();
75
+
76
+ /**
77
+ * Whether the material uses node objects or not.
78
+ *
79
+ * @type {Boolean}
80
+ */
59
81
  this.hasNode = this.containsNode( builder );
82
+
83
+ /**
84
+ * Whether the node builder's 3D object is animated or not.
85
+ *
86
+ * @type {Boolean}
87
+ */
60
88
  this.hasAnimation = builder.object.isSkinnedMesh === true;
89
+
90
+ /**
91
+ * A list of all possible material uniforms
92
+ *
93
+ * @type {Array<String>}
94
+ */
61
95
  this.refreshUniforms = refreshUniforms;
96
+
97
+ /**
98
+ * Holds the current render ID from the node frame.
99
+ *
100
+ * @type {Number}
101
+ * @default 0
102
+ */
62
103
  this.renderId = 0;
63
104
 
64
105
  }
65
106
 
107
+ /**
108
+ * Returns `true` if the given render object is verified for the first time of this observer.
109
+ *
110
+ * @param {RenderObject} renderObject - The render object.
111
+ * @return {Boolean} Whether the given render object is verified for the first time of this observer.
112
+ */
66
113
  firstInitialization( renderObject ) {
67
114
 
68
115
  const hasInitialized = this.renderObjects.has( renderObject );
@@ -79,6 +126,12 @@ class NodeMaterialObserver {
79
126
 
80
127
  }
81
128
 
129
+ /**
130
+ * Returns monitoring data for the given render object.
131
+ *
132
+ * @param {RenderObject} renderObject - The render object.
133
+ * @return {Object} The monitoring data.
134
+ */
82
135
  getRenderObjectData( renderObject ) {
83
136
 
84
137
  let data = this.renderObjects.get( renderObject );
@@ -90,6 +143,7 @@ class NodeMaterialObserver {
90
143
  data = {
91
144
  material: this.getMaterialData( material ),
92
145
  geometry: {
146
+ id: geometry.id,
93
147
  attributes: this.getAttributesData( geometry.attributes ),
94
148
  indexVersion: geometry.index ? geometry.index.version : null,
95
149
  drawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }
@@ -132,6 +186,13 @@ class NodeMaterialObserver {
132
186
 
133
187
  }
134
188
 
189
+ /**
190
+ * Returns an attribute data structure holding the attributes versions for
191
+ * monitoring.
192
+ *
193
+ * @param {Object} attributes - The geometry attributes.
194
+ * @return {Object} An object for monitoring the versions of attributes.
195
+ */
135
196
  getAttributesData( attributes ) {
136
197
 
137
198
  const attributesData = {};
@@ -150,6 +211,13 @@ class NodeMaterialObserver {
150
211
 
151
212
  }
152
213
 
214
+ /**
215
+ * Returns `true` if the node builder's material uses
216
+ * node properties.
217
+ *
218
+ * @param {NodeBuilder} builder - The current node builder.
219
+ * @return {Boolean} Whether the node builder's material uses node properties or not.
220
+ */
153
221
  containsNode( builder ) {
154
222
 
155
223
  const material = builder.material;
@@ -168,6 +236,13 @@ class NodeMaterialObserver {
168
236
 
169
237
  }
170
238
 
239
+ /**
240
+ * Returns a material data structure holding the material property values for
241
+ * monitoring.
242
+ *
243
+ * @param {Material} material - The material.
244
+ * @return {Object} An object for monitoring material properties.
245
+ */
171
246
  getMaterialData( material ) {
172
247
 
173
248
  const data = {};
@@ -202,6 +277,12 @@ class NodeMaterialObserver {
202
277
 
203
278
  }
204
279
 
280
+ /**
281
+ * Returns `true` if the given render object has not changed its state.
282
+ *
283
+ * @param {RenderObject} renderObject - The render object.
284
+ * @return {Boolean} Whether the given render object has changed its state or not.
285
+ */
205
286
  equals( renderObject ) {
206
287
 
207
288
  const { object, material, geometry } = renderObject;
@@ -282,6 +363,13 @@ class NodeMaterialObserver {
282
363
  const storedAttributeNames = Object.keys( storedAttributes );
283
364
  const currentAttributeNames = Object.keys( attributes );
284
365
 
366
+ if ( storedGeometryData.id !== geometry.id ) {
367
+
368
+ storedGeometryData.id = geometry.id;
369
+ return false;
370
+
371
+ }
372
+
285
373
  if ( storedAttributeNames.length !== currentAttributeNames.length ) {
286
374
 
287
375
  renderObjectData.geometry.attributes = this.getAttributesData( attributes );
@@ -382,6 +470,13 @@ class NodeMaterialObserver {
382
470
 
383
471
  }
384
472
 
473
+ /**
474
+ * Checks if the given render object requires a refresh.
475
+ *
476
+ * @param {RenderObject} renderObject - The render object.
477
+ * @param {NodeFrame} nodeFrame - The current node frame.
478
+ * @return {Boolean} Whether the given render object requires a refresh or not.
479
+ */
385
480
  needsRefresh( renderObject, nodeFrame ) {
386
481
 
387
482
  if ( this.hasNode || this.hasAnimation || this.firstInitialization( renderObject ) )