@unikia/upe-renderer 0.186.110 → 0.187.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -0,0 +1,193 @@
1
+ import { Material } from '../Material.js';
2
+
3
+ /**
4
+ * A material instance that reuses the shader of a node material with its own properties.
5
+ * All instances created from the same node material share a single shader build, so
6
+ * configure the node material before creating instances. Instance values are read in
7
+ * the shared node graph with `materialReference( name, type )`. Node properties such as
8
+ * `colorNode` are read-only and always read from the node material.
9
+ *
10
+ * ```js
11
+ * const nodeMaterial = new MeshBasicNodeMaterial();
12
+ * nodeMaterial.colorNode = materialReference( 'myColor', 'color' );
13
+ *
14
+ * const material = new NodeMaterialInstance( nodeMaterial );
15
+ * material.myColor = new Color( 1, 0, 0 );
16
+ * ```
17
+ *
18
+ * @augments Material
19
+ */
20
+ class NodeMaterialInstance extends Material {
21
+
22
+ /**
23
+ * Constructs a new node material instance.
24
+ *
25
+ * @param {NodeMaterial} nodeMaterial - The node material defining the shared shader.
26
+ * @throws {TypeError} When the given material is not a node material.
27
+ */
28
+ constructor( nodeMaterial ) {
29
+
30
+ super();
31
+
32
+ if ( nodeMaterial?.isNodeMaterial !== true ) {
33
+
34
+ throw new TypeError( 'THREE.NodeMaterialInstance: The parameter must be a NodeMaterial.' );
35
+
36
+ }
37
+
38
+ copyProperties( this, nodeMaterial );
39
+
40
+ // Instance values often live in `userData`, so each instance starts with its own copy.
41
+
42
+ this.userData = cloneUserData( nodeMaterial.userData );
43
+
44
+ this.type = 'NodeMaterialInstance';
45
+
46
+ /**
47
+ * This flag can be used for type testing.
48
+ *
49
+ * @type {boolean}
50
+ * @readonly
51
+ * @default true
52
+ */
53
+ this.isNodeMaterialInstance = true;
54
+
55
+ /**
56
+ * The node material defining the shared shader.
57
+ *
58
+ * @type {NodeMaterial}
59
+ */
60
+ this.nodeMaterial = nodeMaterial;
61
+
62
+ }
63
+
64
+ /**
65
+ * Returns a cache key that identifies the shared shader, without traversing
66
+ * the node graph for each instance.
67
+ *
68
+ * @return {string} The custom program cache key.
69
+ */
70
+ customProgramCacheKey() {
71
+
72
+ return this.nodeMaterial.uuid + ',' + this.nodeMaterial.version;
73
+
74
+ }
75
+
76
+ /**
77
+ * Builds the shader of the node material while keeping this instance
78
+ * as `builder.material`.
79
+ *
80
+ * @param {NodeBuilder} builder - The current node builder.
81
+ */
82
+ build( builder ) {
83
+
84
+ this.nodeMaterial.build( builder );
85
+
86
+ }
87
+
88
+ /**
89
+ * The version of the node material. Setting `needsUpdate` on the node material
90
+ * updates all its instances, while setting it on an instance has no effect.
91
+ *
92
+ * @type {number}
93
+ */
94
+ get version() {
95
+
96
+ return this.nodeMaterial.version;
97
+
98
+ }
99
+
100
+ set version( value ) {}
101
+
102
+ /**
103
+ * Copies the values of the given node material instance to this instance.
104
+ * Object values such as colors are shared with the source, except in `userData`.
105
+ * Unlike {@link Material#copy}, `userData` is not copied via JSON: its first level
106
+ * values are cloned when possible, so types such as colors are preserved. Textures
107
+ * remain shared.
108
+ *
109
+ * @param {NodeMaterialInstance} source - The material to copy.
110
+ * @return {NodeMaterialInstance} A reference to this instance.
111
+ */
112
+ copy( source ) {
113
+
114
+ copyProperties( this, source );
115
+
116
+ this.userData = cloneUserData( source.userData );
117
+
118
+ return this;
119
+
120
+ }
121
+
122
+ /**
123
+ * Returns a new node material instance that shares the same node material.
124
+ *
125
+ * @return {NodeMaterialInstance} A clone of this instance.
126
+ */
127
+ clone() {
128
+
129
+ return new this.constructor( this.nodeMaterial ).copy( this );
130
+
131
+ }
132
+
133
+ }
134
+
135
+ // Read-only accessors shared by all instances, so node properties always reflect the node material.
136
+ // They must be enumerable since the renderer detects node materials by iterating their properties.
137
+
138
+ const _nodeDescriptors = {};
139
+
140
+ function getNodeDescriptor( property ) {
141
+
142
+ return _nodeDescriptors[ property ] ??= {
143
+ enumerable: true,
144
+ get() {
145
+
146
+ return this.nodeMaterial[ property ];
147
+
148
+ }
149
+ };
150
+
151
+ }
152
+
153
+ // Copies the first level of user data, cloning values such as colors and sharing textures.
154
+
155
+ function cloneUserData( userData ) {
156
+
157
+ const result = {};
158
+
159
+ for ( const key in userData ) {
160
+
161
+ const value = userData[ key ];
162
+
163
+ result[ key ] = value?.clone !== undefined && value.isTexture !== true ? value.clone() : value;
164
+
165
+ }
166
+
167
+ return result;
168
+
169
+ }
170
+
171
+ // Copies configuration while preserving the target's identity and events.
172
+
173
+ function copyProperties( target, source ) {
174
+
175
+ for ( const property of Object.keys( source ) ) {
176
+
177
+ if ( property === 'uuid' || property === 'version' || property === '_listeners' ) continue;
178
+
179
+ if ( property.endsWith( 'Node' ) ) {
180
+
181
+ if ( Object.hasOwn( target, property ) === false ) Object.defineProperty( target, property, getNodeDescriptor( property ) );
182
+
183
+ } else {
184
+
185
+ target[ property ] = source[ property ];
186
+
187
+ }
188
+
189
+ }
190
+
191
+ }
192
+
193
+ export default NodeMaterialInstance;
@@ -3,6 +3,7 @@
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 NodeMaterialInstance } from './NodeMaterialInstance.js';
6
7
  export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js';
7
8
  export { default as LineDashedNodeMaterial } from './LineDashedNodeMaterial.js';
8
9
  export { default as Line2NodeMaterial } from './Line2NodeMaterial.js';
@@ -111,7 +111,7 @@ class PointsNodeMaterial extends SpriteNodeMaterial {
111
111
 
112
112
  // size attenuation
113
113
 
114
- if ( camera.isPerspectiveCamera && sizeAttenuation === true ) {
114
+ if ( camera.isOrthographicCamera !== true && sizeAttenuation === true ) {
115
115
 
116
116
  // follow WebGLRenderer's implementation, and scale by half the canvas height in logical units
117
117
 
@@ -57,7 +57,7 @@ class SpriteNodeMaterial extends NodeMaterial {
57
57
  * particleMaterial.positionNode = positionBuffer.toAttribute();
58
58
  * ```
59
59
  *
60
- * @type {?Node<vec2>}
60
+ * @type {?Node<vec3>}
61
61
  * @default null
62
62
  */
63
63
  this.positionNode = null;
@@ -122,7 +122,7 @@ class SpriteNodeMaterial extends NodeMaterial {
122
122
 
123
123
  }
124
124
 
125
- if ( camera.isPerspectiveCamera && sizeAttenuation === false ) {
125
+ if ( camera.isOrthographicCamera !== true && sizeAttenuation === false ) {
126
126
 
127
127
  scale = scale.mul( mvPosition.z.negate() );
128
128
 
@@ -132,7 +132,7 @@ class SpriteNodeMaterial extends NodeMaterial {
132
132
 
133
133
  if ( object.center && object.center.isVector2 === true ) {
134
134
 
135
- const center = reference( 'center', 'vec2', object );
135
+ const center = reference( 'center', 'vec2' );
136
136
 
137
137
  alignedPosition = alignedPosition.sub( center.sub( 0.5 ) );
138
138
 
@@ -17,9 +17,12 @@ const refreshUniforms = [
17
17
  'clearcoatNormalMap',
18
18
  'clearcoatNormalScale',
19
19
  'clearcoatRoughness',
20
+ 'clearcoatRoughnessMap',
20
21
  'color',
21
22
  'dashOffset',
22
23
  'dashSize',
24
+ 'diffuseRoughness',
25
+ 'diffuseRoughnessMap',
23
26
  'dispersion',
24
27
  'displacementBias',
25
28
  'displacementMap',
@@ -36,8 +39,9 @@ const refreshUniforms = [
36
39
  'iridescence',
37
40
  'iridescenceIOR',
38
41
  'iridescenceMap',
39
- 'iridescenceThickness',
40
42
  'iridescenceThicknessMap',
43
+ 'iridescenceThicknessMaximum',
44
+ 'iridescenceThicknessMinimum',
41
45
  'lightMap',
42
46
  'lightMapIntensity',
43
47
  'linewidth',
@@ -49,6 +53,7 @@ const refreshUniforms = [
49
53
  'normalScale',
50
54
  'opacity',
51
55
  'reflectivity',
56
+ 'refractionRatio',
52
57
  'retroreflectivity',
53
58
  'rotation',
54
59
  'roughness',
@@ -69,6 +74,7 @@ const refreshUniforms = [
69
74
  'specularMap',
70
75
  'steps',
71
76
  'thickness',
77
+ 'thicknessMap',
72
78
  'transmission',
73
79
  'transmissionMap',
74
80
  'wireframe'
@@ -108,6 +114,14 @@ const _geometryCache = new WeakMap();
108
114
  */
109
115
  const _textureCache = new WeakMap();
110
116
 
117
+ /**
118
+ * Holds the output target data for comparison.
119
+ *
120
+ * @private
121
+ * @type {WeakMap<RenderTarget|CanvasTarget,Object>}
122
+ */
123
+ const _outputTargetCache = new WeakMap();
124
+
111
125
  /**
112
126
  * This class is used by {@link WebGPURenderer} as management component.
113
127
  * It's primary purpose is to determine whether render objects require a
@@ -131,7 +145,7 @@ class NodeMaterialObserver {
131
145
  this.renderObjects = new WeakMap();
132
146
 
133
147
  /**
134
- * Whether the material uses node objects or not.
148
+ * Whether the builder's context uses node objects or not.
135
149
  *
136
150
  * @type {boolean}
137
151
  */
@@ -229,6 +243,7 @@ class NodeMaterialObserver {
229
243
  geometryId: geometry.id,
230
244
  geometryVersion: this.getGeometryData( geometry )._version,
231
245
  materialVersion: this.getMaterialData( renderObject.material )._version,
246
+ attributesDisposeVersion: renderObject._geometries.attributes.disposeVersion,
232
247
  worldMatrix: object.matrixWorld.clone()
233
248
  };
234
249
 
@@ -246,7 +261,9 @@ class NodeMaterialObserver {
246
261
 
247
262
  if ( object.isInstancedMesh === true ) {
248
263
 
264
+ data.instanceMatrix = object.instanceMatrix;
249
265
  data.instanceMatrixVersion = object.instanceMatrix.version;
266
+ data.instanceColor = object.instanceColor;
250
267
  data.instanceColorVersion = object.instanceColor !== null ? object.instanceColor.version : null;
251
268
  data.morphTextureVersion = object.morphTexture !== null ? object.morphTexture.version : null;
252
269
  data.instanceCount = object.count;
@@ -269,15 +286,14 @@ class NodeMaterialObserver {
269
286
 
270
287
  // global data
271
288
 
272
- const { width, height } = renderObject.context;
273
-
274
- data.bufferWidth = width;
275
- data.bufferHeight = height;
289
+ data.outputTarget = this.getOutputTarget( renderObject.renderer );
290
+ data.outputTargetVersion = this.getOutputTargetData( data.outputTarget, renderObject.context )._version;
276
291
 
277
- const { environmentIntensity, environmentRotation } = renderObject.scene;
292
+ const { environment, environmentIntensity, environmentRotation } = renderObject.scene;
278
293
 
279
294
  data.environmentIntensity = environmentIntensity;
280
295
  data.environmentRotation = environmentRotation.clone();
296
+ data.environmentVersion = environment !== null ? this.getTextureData( environment )._version : null;
281
297
 
282
298
  data.lights = this.getLightsData( renderObject.lightsNode.getBuiltinLights(), [] );
283
299
 
@@ -289,6 +305,53 @@ class NodeMaterialObserver {
289
305
 
290
306
  }
291
307
 
308
+ /**
309
+ * Returns the current output target of the given renderer. That is the active
310
+ * render target or, if none is set, the output render target or the canvas target.
311
+ *
312
+ * @param {Renderer} renderer - The renderer.
313
+ * @return {RenderTarget|CanvasTarget} The output target.
314
+ */
315
+ getOutputTarget( renderer ) {
316
+
317
+ const renderTarget = renderer.getRenderTarget();
318
+
319
+ return renderTarget !== null ? renderTarget : ( renderer.getOutputRenderTarget() || renderer.getCanvasTarget() );
320
+
321
+ }
322
+
323
+ /**
324
+ * Returns an output target data structure holding the size of the given output
325
+ * target for monitoring. Its version is incremented whenever a size change is observed.
326
+ *
327
+ * @param {RenderTarget|CanvasTarget} outputTarget - The output target.
328
+ * @param {RenderContext} renderContext - The render context.
329
+ * @return {Object} An object for monitoring the output target size.
330
+ */
331
+ getOutputTargetData( outputTarget, renderContext ) {
332
+
333
+ const { width, height } = renderContext;
334
+
335
+ let data = _outputTargetCache.get( outputTarget );
336
+
337
+ if ( data === undefined ) {
338
+
339
+ data = { _version: 0, width, height };
340
+
341
+ _outputTargetCache.set( outputTarget, data );
342
+
343
+ } else if ( data.width !== width || data.height !== height ) {
344
+
345
+ data.width = width;
346
+ data.height = height;
347
+ data._version ++;
348
+
349
+ }
350
+
351
+ return data;
352
+
353
+ }
354
+
292
355
  /**
293
356
  * Returns an attribute data structure holding the attributes versions for
294
357
  * monitoring.
@@ -316,14 +379,15 @@ class NodeMaterialObserver {
316
379
  }
317
380
 
318
381
  /**
319
- * Returns `true` if the node builder's material uses
320
- * node properties.
382
+ * Returns `true` if the node builder's context (e.g. material) uses node properties.
321
383
  *
322
384
  * @param {NodeBuilder} builder - The current node builder.
323
- * @return {boolean} Whether the node builder's material uses node properties or not.
385
+ * @return {boolean} Whether the node builder's context uses node properties or not.
324
386
  */
325
387
  containsNode( builder ) {
326
388
 
389
+ // material
390
+
327
391
  const material = builder.material;
328
392
 
329
393
  for ( const property in material ) {
@@ -333,7 +397,9 @@ class NodeMaterialObserver {
333
397
 
334
398
  }
335
399
 
336
- if ( builder.context.modelViewMatrix || builder.context.modelNormalViewMatrix || builder.context.getAO || builder.context.getShadow )
400
+ // context
401
+
402
+ if ( builder.context.modelViewMatrix || builder.context.modelNormalViewMatrix || builder.context.getAO || builder.context.getShadow || builder.context.getGI )
337
403
  return true;
338
404
 
339
405
  return false;
@@ -420,6 +486,44 @@ class NodeMaterialObserver {
420
486
 
421
487
  }
422
488
 
489
+ /**
490
+ * Returns a data structure holding the uv transformation of the given
491
+ * texture for monitoring.
492
+ *
493
+ * @param {Texture} texture - The texture.
494
+ * @return {Object} An object for monitoring the uv transformation.
495
+ */
496
+ getTextureTransformData( texture ) {
497
+
498
+ return {
499
+ offset: texture.offset.clone(),
500
+ repeat: texture.repeat.clone(),
501
+ center: texture.center.clone(),
502
+ rotation: texture.rotation,
503
+ matrix: texture.matrix.clone()
504
+ };
505
+
506
+ }
507
+
508
+ /**
509
+ * Returns `true` if the uv transformation of the given texture has not changed.
510
+ *
511
+ * @param {Object} transformData - The monitored uv transformation.
512
+ * @param {Texture} texture - The texture.
513
+ * @return {boolean} Whether the uv transformation has not changed or not.
514
+ */
515
+ equalsTextureTransform( transformData, texture ) {
516
+
517
+ if ( texture.matrixAutoUpdate === true ) {
518
+
519
+ return transformData.rotation === texture.rotation && transformData.offset.equals( texture.offset ) && transformData.repeat.equals( texture.repeat ) && transformData.center.equals( texture.center );
520
+
521
+ }
522
+
523
+ return transformData.matrix.equals( texture.matrix );
524
+
525
+ }
526
+
423
527
  /**
424
528
  * Returns a material data structure holding the material property values for
425
529
  * monitoring.
@@ -449,7 +553,7 @@ class NodeMaterialObserver {
449
553
 
450
554
  if ( value.isTexture === true ) {
451
555
 
452
- data[ property ] = { id: value.id, version: 0, cacheVersion: this.getTextureData( value )._version };
556
+ data[ property ] = { id: value.id, version: 0, cacheVersion: this.getTextureData( value )._version, transform: this.getTextureTransformData( value ) };
453
557
 
454
558
  } else {
455
559
 
@@ -529,7 +633,7 @@ class NodeMaterialObserver {
529
633
 
530
634
  } else if ( mtlValue.isTexture === true ) {
531
635
 
532
- materialData[ property ] = { id: mtlValue.id, version: mtlValue.version, cacheVersion: this.getTextureData( mtlValue )._version };
636
+ materialData[ property ] = { id: mtlValue.id, version: mtlValue.version, cacheVersion: this.getTextureData( mtlValue )._version, transform: this.getTextureTransformData( mtlValue ) };
533
637
 
534
638
  } else if ( typeof mtlValue === 'object' && mtlValue.clone !== undefined ) {
535
639
 
@@ -559,11 +663,16 @@ class NodeMaterialObserver {
559
663
 
560
664
  const textureData = this.getTextureData( mtlValue );
561
665
 
562
- if ( value.id !== mtlValue.id || value.version !== mtlValue.version || value.cacheVersion !== textureData._version ) {
666
+ if ( value.id !== mtlValue.id || value.version !== mtlValue.version || value.cacheVersion !== textureData._version || this.equalsTextureTransform( value.transform, mtlValue ) === false ) {
563
667
 
564
668
  value.id = mtlValue.id;
565
669
  value.version = mtlValue.version;
566
670
  value.cacheVersion = textureData._version;
671
+ value.transform.offset.copy( mtlValue.offset );
672
+ value.transform.repeat.copy( mtlValue.repeat );
673
+ value.transform.center.copy( mtlValue.center );
674
+ value.transform.rotation = mtlValue.rotation;
675
+ value.transform.matrix.copy( mtlValue.matrix );
567
676
 
568
677
  changed = true;
569
678
 
@@ -593,12 +702,13 @@ class NodeMaterialObserver {
593
702
 
594
703
  }
595
704
 
596
- const { width, height } = renderObject.context;
705
+ const outputTargetData = this.getOutputTargetData( renderObjectData.outputTarget, renderObject.context );
706
+
707
+ // a version mismatch means the output target has been resized since this render object was last refreshed
597
708
 
598
- if ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) {
709
+ if ( renderObjectData.outputTargetVersion !== outputTargetData._version ) {
599
710
 
600
- renderObjectData.bufferWidth = width;
601
- renderObjectData.bufferHeight = height;
711
+ renderObjectData.outputTargetVersion = outputTargetData._version;
602
712
 
603
713
  return false;
604
714
 
@@ -742,13 +852,17 @@ class NodeMaterialObserver {
742
852
  const instanceColorVersion = object.instanceColor !== null ? object.instanceColor.version : null;
743
853
  const morphTextureVersion = object.morphTexture !== null ? object.morphTexture.version : null;
744
854
 
745
- if ( renderObjectData.instanceMatrixVersion !== object.instanceMatrix.version ||
855
+ if ( renderObjectData.instanceMatrix !== object.instanceMatrix ||
856
+ renderObjectData.instanceMatrixVersion !== object.instanceMatrix.version ||
857
+ renderObjectData.instanceColor !== object.instanceColor ||
746
858
  renderObjectData.instanceColorVersion !== instanceColorVersion ||
747
859
  renderObjectData.morphTextureVersion !== morphTextureVersion ||
748
- // Only the instances drawn are uploaded: drawing more may need the rest sent (Instance.js).
860
+ // Only the instances drawn are uploaded: drawing more may need the rest sent (Geometries.js).
749
861
  renderObjectData.instanceCount !== object.count ) {
750
862
 
863
+ renderObjectData.instanceMatrix = object.instanceMatrix;
751
864
  renderObjectData.instanceMatrixVersion = object.instanceMatrix.version;
865
+ renderObjectData.instanceColor = object.instanceColor;
752
866
  renderObjectData.instanceColorVersion = instanceColorVersion;
753
867
  renderObjectData.morphTextureVersion = morphTextureVersion;
754
868
  renderObjectData.instanceCount = object.count;
@@ -810,11 +924,15 @@ class NodeMaterialObserver {
810
924
 
811
925
  if ( scene.environment !== null && material.envMap === null ) {
812
926
 
927
+ const environmentVersion = this.getTextureData( scene.environment )._version;
928
+
813
929
  if ( renderObjectData.environmentIntensity !== scene.environmentIntensity ||
814
- renderObjectData.environmentRotation.equals( scene.environmentRotation ) === false ) {
930
+ renderObjectData.environmentRotation.equals( scene.environmentRotation ) === false ||
931
+ renderObjectData.environmentVersion !== environmentVersion ) {
815
932
 
816
933
  renderObjectData.environmentIntensity = scene.environmentIntensity;
817
934
  renderObjectData.environmentRotation.copy( scene.environmentRotation );
935
+ renderObjectData.environmentVersion = environmentVersion;
818
936
 
819
937
  return false;
820
938
 
@@ -921,6 +1039,34 @@ class NodeMaterialObserver {
921
1039
 
922
1040
  }
923
1041
 
1042
+ /**
1043
+ * Returns `true` if a vertex buffer or the index of the given render object
1044
+ * has been disposed since the last check.
1045
+ *
1046
+ * @param {RenderObject} renderObject - The render object.
1047
+ * @param {Object} renderObjectData - The cached render object data.
1048
+ * @return {boolean} Whether attributes of the render object have been disposed or not.
1049
+ */
1050
+ hasDisposedAttributes( renderObject, renderObjectData ) {
1051
+
1052
+ const attributes = renderObject._geometries.attributes;
1053
+
1054
+ for ( const vertexBuffer of renderObject.getVertexBuffers() ) {
1055
+
1056
+ if ( attributes.has( vertexBuffer ) === false ) return true;
1057
+
1058
+ }
1059
+
1060
+ const index = renderObject.getIndex();
1061
+
1062
+ if ( index !== null && attributes.has( index ) === false ) return true;
1063
+
1064
+ renderObjectData.attributesDisposeVersion = attributes.disposeVersion;
1065
+
1066
+ return false;
1067
+
1068
+ }
1069
+
924
1070
  /**
925
1071
  * Checks if the given render object requires a refresh.
926
1072
  *
@@ -950,8 +1096,31 @@ class NodeMaterialObserver {
950
1096
 
951
1097
  }
952
1098
 
1099
+ // bindings might refer to per-target resources so a target switch needs a full refresh
1100
+
1101
+ const renderObjectData = this.getRenderObjectData( renderObject );
1102
+ const outputTarget = this.getOutputTarget( nodeFrame.renderer );
1103
+
1104
+ if ( renderObjectData.outputTarget !== outputTarget ) {
1105
+
1106
+ renderObjectData.outputTarget = outputTarget;
1107
+
1108
+ refreshType = RenderObjectRefreshType.FULL;
1109
+
1110
+ }
1111
+
1112
+ const attributes = renderObject._geometries.attributes;
1113
+
1114
+ // re-upload disposed attributes. checked before the static early out since other geometries can destroy shared buffers
1115
+
1116
+ if ( renderObjectData.attributesDisposeVersion !== attributes.disposeVersion ) {
1117
+
1118
+ if ( this.hasDisposedAttributes( renderObject, renderObjectData ) ) refreshType = RenderObjectRefreshType.FULL;
1119
+
1120
+ }
1121
+
953
1122
  const isStatic = renderObject.object.static === true;
954
- const isBundle = renderObject.bundle !== null && renderObject.bundle.static === true && this.getRenderObjectData( renderObject ).version === renderObject.bundle.version;
1123
+ const isBundle = renderObject.bundle !== null && renderObject.bundle.static === true && renderObjectData.version === renderObject.bundle.version;
955
1124
 
956
1125
  if ( isStatic || isBundle )
957
1126
  return refreshType;
package/src/math/Box3.js CHANGED
@@ -314,9 +314,9 @@ class Box3 {
314
314
  const positionAttribute = geometry.getAttribute( 'position' );
315
315
 
316
316
  // precise AABB computation based on vertex data requires at least a position attribute.
317
- // instancing isn't supported so far and uses the normal (conservative) code path.
317
+ // instancing and batching aren't supported so far and use the normal (conservative) code path.
318
318
 
319
- if ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {
319
+ if ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true && object.isBatchedMesh !== true ) {
320
320
 
321
321
  for ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {
322
322
 
package/src/math/Color.js CHANGED
@@ -313,7 +313,7 @@ class Color {
313
313
  case 'rgb':
314
314
  case 'rgba':
315
315
 
316
- if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
316
+ if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?|\.\d+)\s*)?$/.exec( components ) ) {
317
317
 
318
318
  // rgb(255,0,0) rgba(255,0,0,0.5)
319
319
 
@@ -328,16 +328,16 @@ class Color {
328
328
 
329
329
  }
330
330
 
331
- if ( color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
331
+ if ( color = /^\s*(\d+(?:\.\d+)?|\.\d+)\%\s*,\s*(\d+(?:\.\d+)?|\.\d+)\%\s*,\s*(\d+(?:\.\d+)?|\.\d+)\%\s*(?:,\s*(\d+(?:\.\d+)?|\.\d+)\s*)?$/.exec( components ) ) {
332
332
 
333
- // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
333
+ // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) rgb(50.5%,0%,0%)
334
334
 
335
335
  handleAlpha( color[ 4 ] );
336
336
 
337
337
  return this.setRGB(
338
- Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,
339
- Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,
340
- Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,
338
+ Math.min( 100, parseFloat( color[ 1 ] ) ) / 100,
339
+ Math.min( 100, parseFloat( color[ 2 ] ) ) / 100,
340
+ Math.min( 100, parseFloat( color[ 3 ] ) ) / 100,
341
341
  colorSpace
342
342
  );
343
343
 
@@ -348,9 +348,9 @@ class Color {
348
348
  case 'hsl':
349
349
  case 'hsla':
350
350
 
351
- if ( color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
351
+ if ( color = /^\s*([+-]?(?:\d+(?:\.\d+)?|\.\d+))\s*,\s*(\d+(?:\.\d+)?|\.\d+)\%\s*,\s*(\d+(?:\.\d+)?|\.\d+)\%\s*(?:,\s*(\d+(?:\.\d+)?|\.\d+)\s*)?$/.exec( components ) ) {
352
352
 
353
- // hsl(120,50%,50%) hsla(120,50%,50%,0.5)
353
+ // hsl(120,50%,50%) hsla(120,50%,50%,0.5) hsl(-120,50%,50%)
354
354
 
355
355
  handleAlpha( color[ 4 ] );
356
356