@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
@@ -2265,8 +2265,8 @@ class GLTFWriter {
2265
2265
  if ( isOrtho ) {
2266
2266
 
2267
2267
  cameraDef.orthographic = {
2268
- xmag: camera.right * 2,
2269
- ymag: camera.top * 2,
2268
+ xmag: camera.right,
2269
+ ymag: camera.top,
2270
2270
  zfar: camera.far <= 0 ? 0.001 : camera.far,
2271
2271
  znear: camera.near < 0 ? 0 : camera.near
2272
2272
  };
@@ -3126,8 +3126,8 @@ class GLTFMaterialsIridescenceExtension {
3126
3126
  }
3127
3127
 
3128
3128
  extensionDef.iridescenceIor = material.iridescenceIOR;
3129
- extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];
3130
- extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];
3129
+ extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessMinimum;
3130
+ extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessMaximum;
3131
3131
 
3132
3132
  if ( material.iridescenceThicknessMap ) {
3133
3133
 
@@ -143,7 +143,7 @@ export class KTX2Exporter {
143
143
  * This method has two variants.
144
144
  *
145
145
  * - When exporting a data texture, it receives one parameter. The data or 3D data texture.
146
- * - When exporting a render target (e.g. a PMREM), it receives two parameters. The renderer and the
146
+ * - When exporting a render target, it receives two parameters. The renderer and the
147
147
  * render target.
148
148
  *
149
149
  * @async
@@ -58,6 +58,7 @@ class OBJExporter {
58
58
  const vertices = geometry.getAttribute( 'position' );
59
59
  const normals = geometry.getAttribute( 'normal' );
60
60
  const uvs = geometry.getAttribute( 'uv' );
61
+ const colors = geometry.getAttribute( 'color' );
61
62
  const indices = geometry.getIndex();
62
63
 
63
64
  // name of the mesh object
@@ -82,7 +83,19 @@ class OBJExporter {
82
83
  vertex.applyMatrix4( mesh.matrixWorld );
83
84
 
84
85
  // transform the vertex to export format
85
- output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
86
+ output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z;
87
+
88
+ if ( colors !== undefined ) {
89
+
90
+ color.fromBufferAttribute( colors, i );
91
+
92
+ ColorManagement.workingToColorSpace( color, SRGBColorSpace );
93
+
94
+ output += ' ' + color.r + ' ' + color.g + ' ' + color.b;
95
+
96
+ }
97
+
98
+ output += '\n';
86
99
 
87
100
  }
88
101
 
@@ -177,6 +190,7 @@ class OBJExporter {
177
190
 
178
191
  // shortcuts
179
192
  const vertices = geometry.getAttribute( 'position' );
193
+ const indices = geometry.getIndex();
180
194
 
181
195
  // name of the line object
182
196
  output += 'o ' + line.name + '\n';
@@ -201,9 +215,23 @@ class OBJExporter {
201
215
 
202
216
  output += 'l ';
203
217
 
204
- for ( let j = 1, l = vertices.count; j <= l; j ++ ) {
218
+ if ( indices !== null ) {
205
219
 
206
- output += ( indexVertex + j ) + ' ';
220
+ for ( let i = 0, l = indices.count; i < l; i ++ ) {
221
+
222
+ const j = indices.getX( i ) + 1;
223
+
224
+ output += ( indexVertex + j ) + ' ';
225
+
226
+ }
227
+
228
+ } else {
229
+
230
+ for ( let j = 1, l = vertices.count; j <= l; j ++ ) {
231
+
232
+ output += ( indexVertex + j ) + ' ';
233
+
234
+ }
207
235
 
208
236
  }
209
237
 
@@ -213,9 +241,24 @@ class OBJExporter {
213
241
 
214
242
  if ( type === 'LineSegments' ) {
215
243
 
216
- for ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {
244
+ if ( indices !== null ) {
217
245
 
218
- output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
246
+ for ( let i = 0, l = indices.count - 1; i < l; i += 2 ) {
247
+
248
+ const j = indices.getX( i ) + 1;
249
+ const k = indices.getX( i + 1 ) + 1;
250
+
251
+ output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
252
+
253
+ }
254
+
255
+ } else {
256
+
257
+ for ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {
258
+
259
+ output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
260
+
261
+ }
219
262
 
220
263
  }
221
264
 
@@ -12,7 +12,7 @@ import {
12
12
  * PLY (Polygon or Stanford Triangle Format) is a file format for efficient delivery and
13
13
  * loading of simple, static 3D content in a dense format. Both binary and ascii formats are
14
14
  * supported. PLY can store vertex positions, colors, normals and uv coordinates. No textures
15
- * or texture references are saved.
15
+ * or texture references are saved. Quantized attributes must be normalized.
16
16
  *
17
17
  * ```js
18
18
  * const exporter = new PLYExporter();
@@ -114,33 +114,33 @@ class PLYExporter {
114
114
  vertexCount += vertices.count;
115
115
  faceCount += indices ? indices.count / 3 : vertices.count / 3;
116
116
 
117
- positionType = getPlyType( vertices.array );
117
+ positionType = getPlyType( vertices );
118
118
 
119
119
  if ( normals !== undefined ) {
120
120
 
121
121
  includeNormals = true;
122
- normalType = getPlyType( normals.array );
122
+ normalType = getPlyType( normals );
123
123
 
124
124
  }
125
125
 
126
126
  if ( uvs !== undefined ) {
127
127
 
128
128
  includeUVs = true;
129
- uvType = getPlyType( uvs.array );
129
+ uvType = getPlyType( uvs );
130
130
 
131
131
  }
132
132
 
133
133
  if ( colors !== undefined ) {
134
134
 
135
135
  includeColors = true;
136
- colorType = getPlyType( colors.array );
136
+ colorType = getPlyType( colors );
137
137
 
138
138
  }
139
139
 
140
140
  for ( const name of customAttributeNames ) {
141
141
 
142
142
  const attr = geometry.getAttribute( name );
143
- if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr.array );
143
+ if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr );
144
144
 
145
145
  }
146
146
 
@@ -153,28 +153,34 @@ class PLYExporter {
153
153
  const normals = geometry.getAttribute( 'normal' );
154
154
  const colors = geometry.getAttribute( 'color' );
155
155
 
156
+ if ( vertices === undefined ) {
157
+
158
+ return;
159
+
160
+ }
161
+
156
162
  vertexCount += vertices.count;
157
163
 
158
- positionType = getPlyType( vertices.array );
164
+ positionType = getPlyType( vertices );
159
165
 
160
166
  if ( normals !== undefined ) {
161
167
 
162
168
  includeNormals = true;
163
- normalType = getPlyType( normals.array );
169
+ normalType = getPlyType( normals );
164
170
 
165
171
  }
166
172
 
167
173
  if ( colors !== undefined ) {
168
174
 
169
175
  includeColors = true;
170
- colorType = getPlyType( colors.array );
176
+ colorType = getPlyType( colors );
171
177
 
172
178
  }
173
179
 
174
180
  for ( const name of customAttributeNames ) {
175
181
 
176
182
  const attr = geometry.getAttribute( name );
177
- if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr.array );
183
+ if ( attr !== undefined ) customTypes[ name ] = getPlyType( attr );
178
184
 
179
185
  }
180
186
 
@@ -688,7 +694,11 @@ class PLYExporter {
688
694
 
689
695
  }
690
696
 
691
- function getPlyType( array ) {
697
+ function getPlyType( attribute ) {
698
+
699
+ const { array, normalized } = attribute;
700
+
701
+ if ( normalized === true ) return 'float';
692
702
 
693
703
  if ( array instanceof Int8Array ) return 'char';
694
704
  if ( array instanceof Uint8Array || array instanceof Uint8ClampedArray ) return 'uchar';
@@ -698,6 +708,7 @@ function getPlyType( array ) {
698
708
  if ( array instanceof Uint32Array ) return 'uint';
699
709
  if ( array instanceof Float32Array ) return 'float';
700
710
  if ( array instanceof Float64Array ) return 'double';
711
+
701
712
  return 'float';
702
713
 
703
714
  }
@@ -564,12 +564,13 @@ function buildingColorNode( layout, seed = 0 ) {
564
564
  *
565
565
  * @param {Object} layout - The city layout.
566
566
  * @param {number|Node<uint>} [seed=0] - A fixed seed, or {@link CityGenerator#seedNode} for a changing city.
567
+ * @param {Object} [options] - The features of the material, see {@link createSkyscraperMaterial}.
567
568
  * @return {MeshStandardNodeMaterial} The building material.
568
569
  */
569
- function createBuildingMaterial( layout, seed = 0 ) {
570
+ function createBuildingMaterial( layout, seed = 0, options = {} ) {
570
571
 
571
572
  // the pick is constant across a tower, so resolve it once per vertex ( varying )
572
- return createSkyscraperMaterial( varying( buildingColorNode( layout, seed ) ) );
573
+ return createSkyscraperMaterial( varying( buildingColorNode( layout, seed ) ), options );
573
574
 
574
575
  }
575
576
 
@@ -20,7 +20,7 @@ import {
20
20
  } from 'three';
21
21
 
22
22
  import { MeshStandardNodeMaterial } from 'three/webgpu';
23
- import { attribute, cameraPosition, color, cross, dot, float, floor, Fn, fract, fwidth, hash as ihash, mix, mod, modelWorldMatrixInverse, mx_fractal_noise_float, normalLocal, normalWorldGeometry, positionLocal, positionWorld, select, smoothstep, step, uint, uv, varying, vec2, vec3, vec4 } from 'three/tsl';
23
+ import { attribute, cameraPosition, color, cross, dot, EPSILON, float, floor, Fn, fract, fwidth, hash as ihash, mix, mod, modelWorldMatrixInverse, mx_fractal_noise_float, normalLocal, normalWorldGeometry, positionLocal, positionWorld, select, smoothstep, step, uint, uv, varying, vec2, vec3, vec4 } from 'three/tsl';
24
24
 
25
25
  import { mergeGeometries } from '../../utils/BufferGeometryUtils.js';
26
26
  import { bumpNormal } from './CityGeneratorUtils.js';
@@ -1105,6 +1105,10 @@ function buildFinialGeometry( p ) {
1105
1105
 
1106
1106
  // --- material ------------------------------------------------------------
1107
1107
 
1108
+ // the room behind a pane, shared by the room functions so the material carries it in one varying. flat so
1109
+ // floor() can't split one pane across two cell ids ( the centre is per-room )
1110
+ const roomCenter = /*@__PURE__*/ varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
1111
+
1108
1112
  // interior mapping: fakes a furnished room behind each glass pane in the fragment
1109
1113
  // shader — no geometry, no texture. every pane carries the room it looks into ( centre +
1110
1114
  // size, baked per window by addWindows ), so neighbouring panes share one interior. the
@@ -1112,8 +1116,6 @@ function buildFinialGeometry( p ) {
1112
1116
  // it meets are shaded procedurally, keyed off a per-room hash. returns vec4( colour, lit ).
1113
1117
  const interior = /*@__PURE__*/ Fn( () => {
1114
1118
 
1115
- // flat so floor() below can't split one pane across two cell ids ( centre is per-room )
1116
- const roomCenter = varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
1117
1119
  const roomSize = attribute( 'roomSize', 'vec2' );
1118
1120
 
1119
1121
  // a per-face frame from the geometry normal ( holds on every facade, including the
@@ -1297,6 +1299,33 @@ const interior = /*@__PURE__*/ Fn( () => {
1297
1299
 
1298
1300
  } );
1299
1301
 
1302
+ // the room of interior() seen from far away: the average colour of its plaster and its lights, without
1303
+ // the raymarch. the room hash matches interior(), so the same rooms are lit. returns vec4( colour, lit ).
1304
+ const roomAverage = /*@__PURE__*/ Fn( () => {
1305
+
1306
+ const cell = floor( roomCenter.mul( 2.0 ) );
1307
+ const ckey = uint( cell.x.add( 1 << 21 ) ).mul( uint( 73856093 ) )
1308
+ .bitXor( uint( cell.y.add( 1 << 21 ) ).mul( uint( 19349663 ) ) )
1309
+ .bitXor( uint( cell.z.add( 1 << 21 ) ).mul( uint( 83492791 ) ) ).toVar();
1310
+ const hash = ( kx, ky, kz ) => ihash( ckey.add( uint( Math.round( ( kx + ky * 7 + kz * 13 ) * 100 ) ) ) );
1311
+ const seed = hash( 12.9898, 78.233, 37.719 );
1312
+ const seed2 = hash( 39.346, 11.135, 83.155 );
1313
+ const lit = step( 0.8, hash( 63.21, 9.17, 51.43 ) );
1314
+
1315
+ const warmLight = mix( color( 0xffb845 ), color( 0xffe49c ), hash( 27.1, 4.9, 61.7 ) );
1316
+ const coolLight = mix( color( 0xdfe8ff ), color( 0x9fb6ff ), hash( 8.3, 51.2, 17.6 ) );
1317
+ const lightCol = select( hash( 44.7, 19.3, 6.1 ).greaterThan( 0.88 ), coolLight, warmLight );
1318
+
1319
+ // the plaster darkened by the depth falloff and the corners, plus the share of the lamp
1320
+ let wall = mix( color( 0x9a8b73 ), color( 0x6f7a82 ), seed );
1321
+ wall = mix( wall, color( 0xb9ad97 ), seed2.mul( 0.6 ) );
1322
+ const average = wall.mul( 0.62 ).add( lightCol.mul( lit.mul( 0.25 ) ) );
1323
+
1324
+ const warmth = mix( vec3( 1.0, 1.0, 1.0 ), lightCol, lit.mul( 0.85 ) );
1325
+ return vec4( average.mul( warmth ).mul( mix( float( 1.0 ), float( 1.3 ), lit ) ), lit );
1326
+
1327
+ } );
1328
+
1300
1329
  // the ground-floor shops' interior mapping: the same box raymarch as interior(), but
1301
1330
  // dressed as retail space ( tile floor, troffer-lit ceiling, stocked shelving, a sales
1302
1331
  // counter and a window display ), so storefronts read as shops rather than living rooms.
@@ -1304,8 +1333,6 @@ const interior = /*@__PURE__*/ Fn( () => {
1304
1333
  // returns vec4( colour, lit ), like interior().
1305
1334
  const shopInterior = /*@__PURE__*/ Fn( () => {
1306
1335
 
1307
- // flat for the same reason as interior(): floor() must not split a pane across cells
1308
- const roomCenter = varying( attribute( 'roomCenter', 'vec3' ) ).setInterpolation( InterpolationSamplingType.FLAT, InterpolationSamplingMode.EITHER );
1309
1336
  const roomSize = attribute( 'roomSize', 'vec2' );
1310
1337
 
1311
1338
  // the per-face frame and the view ray in room space ( across, up, depth ), as interior()
@@ -1536,7 +1563,7 @@ const valueNoise = /*@__PURE__*/ Fn( ( [ p ] ) => {
1536
1563
  const x11 = mix( corner( 0, 1, 1 ), corner( 1, 1, 1 ), u.x );
1537
1564
  return mix( mix( x00, x10, u.y ), mix( x01, x11, u.y ), u.z ).mul( 2 ).sub( 1 );
1538
1565
 
1539
- } ).setLayout( { name: 'valueNoise', type: 'float', inputs: [ { name: 'p', type: 'vec3' } ] } );
1566
+ }, { p: 'vec3', return: 'float' } );
1540
1567
 
1541
1568
  // fractal ( fBm ) of valueNoise, octaves summed like mx_fractal_noise_float
1542
1569
  // ( amplitude halving, frequency doubling ); unrolled for a compile-time count
@@ -1565,18 +1592,30 @@ const valueFractal = ( p, octaves ) => {
1565
1592
  * what makes it compute-rasterizer friendly. `buildingBase` is the tower's flat
1566
1593
  * masonry colour as a TSL node: pass a `uniform( Color )` for a single tower, or a
1567
1594
  * per-fragment palette pick for a city, so the same material dresses both.
1595
+ *
1596
+ * @param {Node<vec3>} [buildingBase] - The flat masonry colour of the tower.
1597
+ * @param {Object} [options] - The features of the material, cheaper materials leave some out.
1598
+ * @param {boolean|string} [options.interiors=true] - Whether the windows show raymarched rooms, `'average'` shows the average
1599
+ * colour and the light of each room without the raymarch, for distant towers. `false` shows dark glass.
1600
+ * @param {boolean} [options.weathering=true] - Whether the surfaces are weathered by noise ( tone, soot, grime, dust ).
1601
+ * @param {boolean} [options.relief=true] - Whether the brickwork and the AC louvers have a bump relief.
1602
+ * @return {MeshStandardNodeMaterial} The facade material.
1568
1603
  */
1569
- function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1604
+ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ), { interiors = true, weathering = true, relief = true } = {} ) {
1570
1605
 
1571
1606
  const soot = color( 0x4a4236 );
1572
1607
 
1608
+ // the weathering noise, about zero on average
1609
+
1610
+ const weatherNoise = ( node ) => weathering ? node : float( 0 );
1611
+
1573
1612
  // broad weathering, all driven from world position so it reads consistently
1574
1613
  // across instanced and merged meshes: a slow tonal drift, a fine clay mottle,
1575
1614
  // and sooty vertical streaks that pool low down
1576
1615
 
1577
- const tone = varying( mx_fractal_noise_float( positionWorld.mul( 0.03 ), 2 ) ).mul( 0.18 ); // very low frequency: evaluate per-vertex and interpolate over the facade's fine tessellation
1578
- const mottle = valueNoise( positionWorld.mul( 0.7 ) ).mul( 0.06 );
1579
- const streak = mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.5 ), positionWorld.y.mul( 0.04 ), positionWorld.z.mul( 1.5 ) ), 2 );
1616
+ const tone = weathering ? varying( mx_fractal_noise_float( positionWorld.mul( 0.03 ), 2 ) ).mul( 0.18 ) : float( 0 ); // very low frequency: evaluate per-vertex and interpolate over the facade's fine tessellation
1617
+ const mottle = weatherNoise( valueNoise( positionWorld.mul( 0.7 ) ) ).mul( 0.06 );
1618
+ const streak = weathering ? weatherNoise( mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.5 ), positionWorld.y.mul( 0.04 ), positionWorld.z.mul( 1.5 ) ), 2 ) ) : float( - 1 );
1580
1619
  const dirt = smoothstep( - 0.1, 0.45, streak ).mul( smoothstep( 210, 0, positionWorld.y ) ).mul( 0.6 );
1581
1620
 
1582
1621
  // procedural terracotta brickwork in running bond, keyed off the BUILDING-LOCAL position
@@ -1604,8 +1643,8 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1604
1643
  // would spike where the normal flips at pier edges.
1605
1644
  const mU = mortar / ( 2 * brickL );
1606
1645
  const mV = mortar / ( 2 * brickH );
1607
- const ddU = nrm.z.mul( fwidth( positionWorld.x ) ).add( nrm.x.mul( fwidth( positionWorld.z ) ) ).div( brickL ).clamp( 1e-6, 0.5 );
1608
- const ddV = fwidth( rowCoord ).clamp( 1e-6, 0.5 );
1646
+ const ddU = nrm.z.mul( fwidth( positionWorld.x ) ).add( nrm.x.mul( fwidth( positionWorld.z ) ) ).div( brickL ).clamp( EPSILON, 0.5 );
1647
+ const ddV = fwidth( rowCoord ).clamp( EPSILON, 0.5 );
1609
1648
  const distU = float( 0.5 ).sub( fract( colCoord ).sub( 0.5 ).abs() );
1610
1649
  const distV = float( 0.5 ).sub( fract( rowCoord ).sub( 0.5 ).abs() );
1611
1650
  const drawU = ddU.max( mU );
@@ -1629,7 +1668,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1629
1668
  const lodBevel = texel.mul( 1.5 ).max( bevel );
1630
1669
  const brickFace = smoothstep( 0, lodBevel, distU.mul( brickL ) ).mul( smoothstep( 0, lodBevel, distV.mul( brickH ) ) ).mul( wallFacing );
1631
1670
  const reliefHeight = brickFace.mul( 0.003 );
1632
- const rough = valueNoise( positionWorld.mul( 0.5 ) ).mul( 0.08 ).add( 0.82 ).add( joint.mul( 0.12 ) );
1671
+ const rough = weatherNoise( valueNoise( positionWorld.mul( 0.5 ) ) ).mul( 0.08 ).add( 0.82 ).add( joint.mul( 0.12 ) );
1633
1672
 
1634
1673
  // the merged geometry carries a per-vertex partId; this material reads it and
1635
1674
  // branches to reproduce each zone — no per-part materials, compute-raster friendly
@@ -1657,24 +1696,27 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1657
1696
  // larger-scale grime instead of the wall's streaky soot — confined to those surfaces by a
1658
1697
  // branch ( roofMask > 0 ), so the fractal never runs on the vertical facade
1659
1698
  const roofMask = wallFacing.oneMinus();
1660
- const roofGrime = select( roofMask.greaterThan( 0 ), smoothstep( 0.0, 0.55, valueFractal( positionWorld.mul( 0.025 ), 3 ) ).mul( 0.22 ), float( 0 ) );
1699
+ const roofGrime = weathering ? select( roofMask.greaterThan( 0 ), smoothstep( 0.0, 0.55, valueFractal( positionWorld.mul( 0.025 ), 3 ) ).mul( 0.22 ), float( 0 ) ) : float( 0 );
1661
1700
  const stoneColor = mix( masonry, soot, mix( dirt, roofGrime, roofMask ) );
1662
1701
 
1663
1702
  // glass: the interior-mapped room is the base colour; the smooth, low-roughness
1664
1703
  // surface still lets a faint sky reflection ride over it, and lit rooms glow ( emissive ).
1665
1704
  // shopfronts march their own retail interior ( select compiles to a branch, so only one
1666
1705
  // raymarch runs per fragment ). toVar so the result is shared by colour and emissive
1667
- const room = select( isShopGlass, shopInterior(), interior() ).toVar();
1706
+ let room = vec4( color( 0x1d2328 ), 0 );
1707
+
1708
+ if ( interiors === true ) room = select( isShopGlass, shopInterior(), interior() ).toVar();
1709
+ else if ( interiors === 'average' ) room = roomAverage().toVar();
1668
1710
 
1669
1711
  // grimy glazing: the room shows through, but muted by a dusty film and dirt pooled
1670
1712
  // along the bottom of each pane, plus a baseline haze, so the panes read as old
1671
1713
  // glass rather than open holes. the streaks run down the facade ( world Y barely
1672
1714
  // scaled ); the pooled dirt uses the pane's own UV ( y = 0 at the sill ).
1673
- const filmNoise = mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.3 ), positionWorld.y.mul( 0.06 ), positionWorld.z.mul( 1.3 ) ), 2 );
1715
+ const filmNoise = weatherNoise( mx_fractal_noise_float( vec3( positionWorld.x.mul( 1.3 ), positionWorld.y.mul( 0.06 ), positionWorld.z.mul( 1.3 ) ), 2 ) );
1674
1716
  const dustStreak = smoothstep( - 0.15, 0.5, filmNoise ).mul( 0.45 );
1675
1717
  const pooled = smoothstep( 0.32, 0.0, uv().y ).mul( 0.4 );
1676
1718
  const grime = float( 0.64 ).add( dustStreak ).add( pooled ).clamp( 0, 0.95 ); // baseline haze so the panes read as dirty glass, not open holes
1677
- const glassMottle = valueFractal( positionWorld.mul( 0.3 ), 2 ).mul( 0.5 ).add( 0.5 ); // shared by the upper dirty glass and the shop glazing, so the fractal runs once
1719
+ const glassMottle = weatherNoise( valueFractal( positionWorld.mul( 0.3 ), 2 ) ).mul( 0.5 ).add( 0.5 ); // shared by the upper dirty glass and the shop glazing, so the fractal runs once
1678
1720
  const dirtyGlass = mix( color( 0x13161a ), color( 0x232b31 ), glassMottle );
1679
1721
 
1680
1722
  // dirt scatters the reflection too: rougher where grime pools at the sills, so the
@@ -1694,9 +1736,9 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1694
1736
  const acLouver = acVent.mul( acDetail );
1695
1737
 
1696
1738
  // plastic shell: off-white, some units dingier / yellowed than others
1697
- const acDinge = valueNoise( positionWorld.mul( 0.4 ) ).mul( 0.5 ).add( 0.5 ); // ~per-unit
1739
+ const acDinge = weatherNoise( valueNoise( positionWorld.mul( 0.4 ) ) ).mul( 0.5 ).add( 0.5 ); // ~per-unit
1698
1740
  const acPaint = mix( color( 0xf2f1ec ), color( 0xcfccc2 ), acDinge ) // bright white → light dingy grey, both lighter than the wall
1699
- .add( valueNoise( positionWorld.mul( 5 ) ).mul( 0.04 ) );
1741
+ .add( weatherNoise( valueNoise( positionWorld.mul( 5 ) ) ).mul( 0.04 ) );
1700
1742
 
1701
1743
  // a darker recessed grille panel inset into the lighter cabinet, with horizontal louvers
1702
1744
  // inside it ( the front vents ) — the white plastic reads as a thin border frame
@@ -1707,7 +1749,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1707
1749
  const acBody = acPaint.mul( mix( float( 1 ), acFin.mul( 0.42 ), acGrille ) ); // cabinet stays light; recessed grille goes dark grey
1708
1750
 
1709
1751
  // grey-brown condensate grime streaking the lower edge ( plastic doesn't rust ); dirtier units streak more
1710
- const acStreak = valueFractal( vec3( positionWorld.x.mul( 6 ), positionWorld.y.mul( 0.5 ), positionWorld.z.mul( 6 ) ), 3 ).mul( 0.5 ).add( 0.5 );
1752
+ const acStreak = weatherNoise( valueFractal( vec3( positionWorld.x.mul( 6 ), positionWorld.y.mul( 0.5 ), positionWorld.z.mul( 6 ) ), 3 ) ).mul( 0.5 ).add( 0.5 );
1711
1753
  const acGrime = smoothstep( 0.4, 0.0, acUv.y ).mul( acStreak ).mul( acDinge.add( 0.3 ) );
1712
1754
  const acColor = mix( acBody, color( 0x6f685a ), acGrime.mul( 0.5 ) );
1713
1755
 
@@ -1748,7 +1790,7 @@ function createSkyscraperMaterial( buildingBase = color( 0xc6c0b2 ) ) {
1748
1790
  material.roughnessNode = select( isShopGlass, float( 0.14 ), select( isAwning, float( 0.85 ), select( isStore, float( 0.6 ), select( isGlass, glassRough, select( isOrnament, float( 0.8 ), select( isAC, acRough, rough ) ) ) ) ) ); // glass roughness rides on its grime, so dirty panes scatter the reflection
1749
1791
  material.metalnessNode = float( 0 ); // all dielectric — stone, glass, fabric and the plastic AC shells
1750
1792
  material.emissiveNode = select( isGlazing, room.xyz.mul( room.w ).mul( glazingEmit ), color( 0x000000 ) ); // lit rooms / shops glow through the panes
1751
- material.normalNode = bumpNormal( select( isGlass.or( isFrame ).or( isOrnament ).or( isShopGlass ).or( isStore ).or( isAwning ), float( 0 ), select( isAC, acRelief, reliefHeight ) ) ); // glass / frames / ornament / storefronts stay flat; AC has its own louvers
1793
+ if ( relief ) material.normalNode = bumpNormal( select( isGlass.or( isFrame ).or( isOrnament ).or( isShopGlass ).or( isStore ).or( isAwning ), float( 0 ), select( isAC, acRelief, reliefHeight ) ) ); // glass / frames / ornament / storefronts stay flat; AC has its own louvers
1752
1794
 
1753
1795
  return material;
1754
1796
 
@@ -33,14 +33,7 @@ export const getBitonicFlipIndices = /*@__PURE__*/ Fn( ( [ index, blockHeight ]
33
33
 
34
34
  return idx;
35
35
 
36
- } ).setLayout( {
37
- name: 'getBitonicFlipIndices',
38
- type: 'uvec2',
39
- inputs: [
40
- { name: 'index', type: 'uint' },
41
- { name: 'blockHeight', type: 'uint' }
42
- ]
43
- } );
36
+ }, { index: 'uint', blockHeight: 'uint', return: 'uvec2' } );
44
37
 
45
38
  /**
46
39
  * Returns the indices that will be compared in a bitonic sort's disperse operation.
@@ -65,14 +58,7 @@ export const getBitonicDisperseIndices = /*@__PURE__*/ Fn( ( [ index, swapSpan ]
65
58
 
66
59
  return idx;
67
60
 
68
- } ).setLayout( {
69
- name: 'getBitonicDisperseIndices',
70
- type: 'uvec2',
71
- inputs: [
72
- { name: 'index', type: 'uint' },
73
- { name: 'blockHeight', type: 'uint' }
74
- ]
75
- } );
61
+ }, { index: 'uint', blockHeight: 'uint', return: 'uvec2' } );
76
62
 
77
63
  export class BitonicSort {
78
64
 
@@ -626,10 +612,24 @@ export class BitonicSort {
626
612
  */
627
613
  computeStep( renderer ) {
628
614
 
615
+ renderer.compute( this._getStepNodes() );
616
+
617
+ }
618
+
619
+ /**
620
+ * Get the compute shaders that execute the next step of the bitonic sort, and advance the sort past that step.
621
+ *
622
+ * @private
623
+ * @returns {Array<ComputeNode>} The compute shaders of the step, in dispatch order.
624
+ */
625
+ _getStepNodes() {
626
+
627
+ const computeNodes = [];
628
+
629
629
  // Swap local only runs once
630
630
  if ( this.currentDispatch === 0 ) {
631
631
 
632
- renderer.compute( this.swapLocalFn );
632
+ computeNodes.push( this.swapLocalFn );
633
633
 
634
634
  this.globalOpsRemaining = 1;
635
635
  this.globalOpsInSpan = 1;
@@ -638,7 +638,7 @@ export class BitonicSort {
638
638
 
639
639
  const swapType = this.globalOpsRemaining === this.globalOpsInSpan ? 'Flip' : 'Disperse';
640
640
 
641
- renderer.compute( swapType === 'Flip' ? this.flipGlobalNodes[ this.readBufferName ] : this.disperseGlobalNodes[ this.readBufferName ] );
641
+ computeNodes.push( swapType === 'Flip' ? this.flipGlobalNodes[ this.readBufferName ] : this.disperseGlobalNodes[ this.readBufferName ] );
642
642
 
643
643
  if ( this.readBufferName === 'Data' ) {
644
644
 
@@ -655,7 +655,7 @@ export class BitonicSort {
655
655
  } else {
656
656
 
657
657
  // Then run local disperses when we've finished all global swaps
658
- renderer.compute( this.disperseLocalNodes[ this.readBufferName ] );
658
+ computeNodes.push( this.disperseLocalNodes[ this.readBufferName ] );
659
659
 
660
660
  const nextSpanGlobalOps = this.globalOpsInSpan + 1;
661
661
  this.globalOpsInSpan = nextSpanGlobalOps;
@@ -672,13 +672,13 @@ export class BitonicSort {
672
672
  // to fulfill the requirement of an in-place sort.
673
673
  if ( this.readBufferName === 'Temp' ) {
674
674
 
675
- renderer.compute( this.alignFn );
675
+ computeNodes.push( this.alignFn );
676
676
  this.readBufferName = 'Data';
677
677
 
678
678
  }
679
679
 
680
680
  // Just reset the algorithm information
681
- renderer.compute( this.resetFn );
681
+ computeNodes.push( this.resetFn );
682
682
 
683
683
  this.currentDispatch = 0;
684
684
  this.globalOpsRemaining = 0;
@@ -687,10 +687,12 @@ export class BitonicSort {
687
687
  } else {
688
688
 
689
689
  // Otherwise, determine what next swap span is
690
- renderer.compute( this.setAlgoFn );
690
+ computeNodes.push( this.setAlgoFn );
691
691
 
692
692
  }
693
693
 
694
+ return computeNodes;
695
+
694
696
  }
695
697
 
696
698
  /**
@@ -704,12 +706,17 @@ export class BitonicSort {
704
706
  this.globalOpsInSpan = 0;
705
707
  this.currentDispatch = 0;
706
708
 
709
+ const computeNodes = [];
710
+
707
711
  for ( let i = 0; i < this.stepCount; i ++ ) {
708
712
 
709
- this.computeStep( renderer );
713
+ computeNodes.push( ...this._getStepNodes() );
710
714
 
711
715
  }
712
716
 
717
+ // Dispatch the whole sort at once, so it runs in one compute pass instead of one pass per shader
718
+ renderer.compute( computeNodes );
719
+
713
720
  }
714
721
 
715
722
  }
@@ -29,7 +29,7 @@ class VertexTangentsHelper extends LineSegments {
29
29
  *
30
30
  * @param {Object3D} object - The object for which to visualize vertex tangents.
31
31
  * @param {number} [size=1] - The helper's size.
32
- * @param {number|Color|string} [color=0xff0000] - The helper's color.
32
+ * @param {number|Color|string} [color=0x00ffff] - The helper's color.
33
33
  */
34
34
  constructor( object, size = 1, color = 0x00ffff ) {
35
35
 
@@ -1,5 +1,5 @@
1
1
  import { Tab } from 'three/addons/inspector/ui/Tab.js';
2
- import { getItem, setItem } from './Inspector.js';
2
+ import { getItem, setItem } from './Storage.js';
3
3
 
4
4
  export class Extension extends Tab {
5
5