@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -0,0 +1,788 @@
1
+ /**
2
+ * LUTMath.js - Mathematical operations for LUT 3D Generator
3
+ */
4
+
5
+ import { REVISION } from '@gnsx/three';
6
+
7
+ // Monotone cubic spline evaluation for curve points
8
+ export function evaluateSpline( t, points ) {
9
+
10
+ if ( ! points || points.length === 0 ) return t;
11
+ if ( points.length === 1 ) return points[ 0 ].y;
12
+
13
+ const pts = points;
14
+
15
+ if ( t <= pts[ 0 ].x ) return pts[ 0 ].y;
16
+ if ( t >= pts[ pts.length - 1 ].x ) return pts[ pts.length - 1 ].y;
17
+
18
+ // Find segment
19
+ let i = 0;
20
+ while ( i < pts.length - 1 && pts[ i + 1 ].x < t ) {
21
+
22
+ i ++;
23
+
24
+ }
25
+
26
+ const p0 = pts[ i ];
27
+ const p1 = pts[ i + 1 ];
28
+ const h = p1.x - p0.x;
29
+
30
+ if ( h <= 0.00001 ) return p0.y;
31
+
32
+ // Secants
33
+ const d = ( p1.y - p0.y ) / h;
34
+
35
+ // Tangents computation (Fritsch-Carlson monotone cubic Hermite)
36
+ let m0 = d;
37
+ let m1 = d;
38
+
39
+ if ( i > 0 ) {
40
+
41
+ const prevD = ( p0.y - pts[ i - 1 ].y ) / ( p0.x - pts[ i - 1 ].x );
42
+ m0 = 0.5 * ( prevD + d );
43
+
44
+ }
45
+
46
+ if ( i < pts.length - 2 ) {
47
+
48
+ const nextD = ( pts[ i + 2 ].y - p1.y ) / ( pts[ i + 2 ].x - p1.x );
49
+ m1 = 0.5 * ( d + nextD );
50
+
51
+ }
52
+
53
+ // Hermite basis
54
+ const localT = ( t - p0.x ) / h;
55
+ const t2 = localT * localT;
56
+ const t3 = t2 * localT;
57
+
58
+ const h00 = 2 * t3 - 3 * t2 + 1;
59
+ const h10 = t3 - 2 * t2 + localT;
60
+ const h01 = - 2 * t3 + 3 * t2;
61
+ const h11 = t3 - t2;
62
+
63
+ const val = h00 * p0.y + h10 * h * m0 + h01 * p1.y + h11 * h * m1;
64
+
65
+ return Math.max( 0, Math.min( 1, val ) );
66
+
67
+ }
68
+
69
+ // RGB to HSV conversion
70
+ export function rgbToHsv( r, g, b ) {
71
+
72
+ const max = Math.max( r, g, b );
73
+ const min = Math.min( r, g, b );
74
+ const d = max - min;
75
+ let h = 0;
76
+ const s = max === 0 ? 0 : d / max;
77
+ const v = max;
78
+
79
+ if ( max !== min ) {
80
+
81
+ switch ( max ) {
82
+
83
+ case r: h = ( g - b ) / d + ( g < b ? 6 : 0 ); break;
84
+ case g: h = ( b - r ) / d + 2; break;
85
+ case b: h = ( r - g ) / d + 4; break;
86
+
87
+ }
88
+
89
+ h /= 6;
90
+
91
+ }
92
+
93
+ return [ h, s, v ];
94
+
95
+ }
96
+
97
+ // HSV to RGB conversion
98
+ export function hsvToRgb( h, s, v ) {
99
+
100
+ let r = 0, g = 0, b = 0;
101
+
102
+ const i = Math.floor( h * 6 );
103
+ const f = h * 6 - i;
104
+ const p = v * ( 1 - s );
105
+ const q = v * ( 1 - f * s );
106
+ const t = v * ( 1 - ( 1 - f ) * s );
107
+
108
+ switch ( i % 6 ) {
109
+
110
+ case 0: r = v; g = t; b = p; break;
111
+ case 1: r = q; g = v; b = p; break;
112
+ case 2: r = p; g = v; b = t; break;
113
+ case 3: r = p; g = q; b = v; break;
114
+ case 4: r = t; g = p; b = v; break;
115
+ case 5: r = v; g = p; b = q; break;
116
+
117
+ }
118
+
119
+ return [ r, g, b ];
120
+
121
+ }
122
+
123
+ // Main color transformation pipeline
124
+ // Trilinear 3D LUT sampling for imported .CUBE datasets
125
+ export function sample3DLUT( r, g, b, size, dataLines ) {
126
+
127
+ const nr = Math.max( 0, Math.min( 1, r ) );
128
+ const ng = Math.max( 0, Math.min( 1, g ) );
129
+ const nb = Math.max( 0, Math.min( 1, b ) );
130
+
131
+ const rx = nr * ( size - 1 );
132
+ const gy = ng * ( size - 1 );
133
+ const bz = nb * ( size - 1 );
134
+
135
+ const x0 = Math.floor( rx );
136
+ const x1 = Math.min( size - 1, x0 + 1 );
137
+ const y0 = Math.floor( gy );
138
+ const y1 = Math.min( size - 1, y0 + 1 );
139
+ const z0 = Math.floor( bz );
140
+ const z1 = Math.min( size - 1, z0 + 1 );
141
+
142
+ const fx = rx - x0;
143
+ const fy = gy - y0;
144
+ const fz = bz - z0;
145
+
146
+ const getVal = ( x, y, z ) => {
147
+
148
+ const index = z * size * size + y * size + x;
149
+ return dataLines[ index ] || [ x / ( size - 1 ), y / ( size - 1 ), z / ( size - 1 ) ];
150
+
151
+ };
152
+
153
+ const c000 = getVal( x0, y0, z0 );
154
+ const c100 = getVal( x1, y0, z0 );
155
+ const c010 = getVal( x0, y1, z0 );
156
+ const c110 = getVal( x1, y0, z0 );
157
+ const c001 = getVal( x0, y0, z1 );
158
+ const c101 = getVal( x1, y0, z1 );
159
+ const c011 = getVal( x0, y1, z1 );
160
+ const c111 = getVal( x1, y1, z1 );
161
+
162
+ const trilinear = ( ch ) => {
163
+
164
+ const c00 = c000[ ch ] * ( 1 - fx ) + c100[ ch ] * fx;
165
+ const c01 = c001[ ch ] * ( 1 - fx ) + c101[ ch ] * fx;
166
+ const c10 = c010[ ch ] * ( 1 - fx ) + c110[ ch ] * fx;
167
+ const c11 = c011[ ch ] * ( 1 - fx ) + c111[ ch ] * fx;
168
+
169
+ const c0 = c00 * ( 1 - fy ) + c10 * fy;
170
+ const c1 = c01 * ( 1 - fy ) + c11 * fy;
171
+
172
+ return c0 * ( 1 - fz ) + c1 * fz;
173
+
174
+ };
175
+
176
+ return [ trilinear( 0 ), trilinear( 1 ), trilinear( 2 ) ];
177
+
178
+ }
179
+
180
+ export function applyColorTransform( r, g, b, params, pipelineOrder = null ) {
181
+
182
+ let cr = r;
183
+ let cg = g;
184
+ let cb = b;
185
+
186
+ const order = pipelineOrder || [
187
+ 'whiteBalance',
188
+ 'exposureHue',
189
+ 'lift',
190
+ 'gammaBal',
191
+ 'gain',
192
+ 'offset',
193
+ 'contrast',
194
+ 'satVibrance'
195
+ ];
196
+
197
+ for ( let i = 0; i < order.length; i ++ ) {
198
+
199
+ const step = order[ i ];
200
+
201
+ if ( step.startsWith( 'importedCube_' ) && params.importedCubes && params.importedCubes[ step ] ) {
202
+
203
+ const cubeInfo = params.importedCubes[ step ];
204
+ const cubeData = cubeInfo.dataLines || cubeInfo.data;
205
+ if ( cubeData && cubeData.length > 0 ) {
206
+
207
+ const [ lr, lg, lb ] = sample3DLUT( cr, cg, cb, cubeInfo.size, cubeData );
208
+ const weight = cubeInfo.weight !== undefined ? cubeInfo.weight : 1.0;
209
+ cr = cr * ( 1 - weight ) + lr * weight;
210
+ cg = cg * ( 1 - weight ) + lg * weight;
211
+ cb = cb * ( 1 - weight ) + lb * weight;
212
+
213
+ }
214
+
215
+ continue;
216
+
217
+ }
218
+
219
+ switch ( step ) {
220
+
221
+ case 'whiteBalance':
222
+ if ( params.temperature !== 0 || params.tint !== 0 ) {
223
+
224
+ const temp = params.temperature / 100;
225
+ const tint = params.tint / 100;
226
+ cr += temp * 0.1;
227
+ cb -= temp * 0.1;
228
+ cg -= tint * 0.1;
229
+
230
+ }
231
+
232
+ break;
233
+
234
+ case 'exposureHue':
235
+ if ( params.exposure !== 0 ) {
236
+
237
+ const factor = Math.pow( 2, params.exposure );
238
+ cr *= factor;
239
+ cg *= factor;
240
+ cb *= factor;
241
+
242
+ }
243
+
244
+ if ( params.brightness ) {
245
+
246
+ cr += params.brightness;
247
+ cg += params.brightness;
248
+ cb += params.brightness;
249
+
250
+ }
251
+
252
+ if ( params.hueShift ) {
253
+
254
+ const [ origH, s, v ] = rgbToHsv( Math.max( 0, cr ), Math.max( 0, cg ), Math.max( 0, cb ) );
255
+ let h = ( origH + params.hueShift / 360 ) % 1;
256
+ if ( h < 0 ) h += 1;
257
+ const [ nr, ng, nb ] = hsvToRgb( h, s, v );
258
+ cr = nr; cg = ng; cb = nb;
259
+
260
+ }
261
+
262
+ break;
263
+
264
+ case 'lift':
265
+ if ( params.lift ) {
266
+
267
+ const ly = params.lift.y || 0;
268
+ const lr = params.lift.r + ly;
269
+ const lg = params.lift.g + ly;
270
+ const lb = params.lift.b + ly;
271
+
272
+ cr += lr * ( 1 - Math.max( 0, Math.min( 1, cr ) ) );
273
+ cg += lg * ( 1 - Math.max( 0, Math.min( 1, cg ) ) );
274
+ cb += lb * ( 1 - Math.max( 0, Math.min( 1, cb ) ) );
275
+
276
+ }
277
+
278
+ break;
279
+
280
+ case 'gammaBal':
281
+ if ( params.gammaBal ) {
282
+
283
+ const gy = params.gammaBal.y || 0;
284
+ const gr = Math.pow( 2.0, - ( params.gammaBal.r + gy ) );
285
+ const gg = Math.pow( 2.0, - ( params.gammaBal.g + gy ) );
286
+ const gb = Math.pow( 2.0, - ( params.gammaBal.b + gy ) );
287
+
288
+ cr = cr > 0 ? Math.pow( cr, gr ) : cr;
289
+ cg = cg > 0 ? Math.pow( cg, gg ) : cg;
290
+ cb = cb > 0 ? Math.pow( cb, gb ) : cb;
291
+
292
+ }
293
+
294
+ break;
295
+
296
+ case 'gain':
297
+ if ( params.gain ) {
298
+
299
+ const gy = params.gain.y || 0;
300
+ const sr = Math.max( 0, 1.0 + ( params.gain.r + gy ) );
301
+ const sg = Math.max( 0, 1.0 + ( params.gain.g + gy ) );
302
+ const sb = Math.max( 0, 1.0 + ( params.gain.b + gy ) );
303
+
304
+ cr *= sr;
305
+ cg *= sg;
306
+ cb *= sb;
307
+
308
+ }
309
+
310
+ break;
311
+
312
+ case 'offset':
313
+ if ( params.offset ) {
314
+
315
+ const oy = params.offset.y || 0;
316
+ cr += params.offset.r + oy;
317
+ cg += params.offset.g + oy;
318
+ cb += params.offset.b + oy;
319
+
320
+ }
321
+
322
+ break;
323
+
324
+ case 'contrast':
325
+ if ( params.contrast !== 1 ) {
326
+
327
+ const pivot = params.contrastPivot !== undefined ? params.contrastPivot : 0.5;
328
+ const c = params.contrast;
329
+ cr = pivot + ( cr - pivot ) * c;
330
+ cg = pivot + ( cg - pivot ) * c;
331
+ cb = pivot + ( cb - pivot ) * c;
332
+
333
+ }
334
+
335
+ break;
336
+
337
+ case 'satVibrance':
338
+ if ( params.saturation !== 1 || params.vibrance !== 0 ) {
339
+
340
+ const [ h, origS, origV ] = rgbToHsv( Math.max( 0, cr ), Math.max( 0, cg ), Math.max( 0, cb ) );
341
+ let s = origS;
342
+
343
+ if ( params.saturation !== 1 ) {
344
+
345
+ s *= params.saturation;
346
+
347
+ }
348
+
349
+ if ( params.vibrance !== 0 ) {
350
+
351
+ const vib = params.vibrance;
352
+ if ( vib > 0 ) {
353
+
354
+ s += ( 1 - s ) * vib * 0.5;
355
+
356
+ } else {
357
+
358
+ s += s * vib * 0.5;
359
+
360
+ }
361
+
362
+ }
363
+
364
+ s = Math.max( 0, Math.min( 1, s ) );
365
+ const v = Math.max( 0, Math.min( 1, origV ) );
366
+ const [ nr, ng, nb ] = hsvToRgb( h, s, v );
367
+ cr = nr; cg = ng; cb = nb;
368
+
369
+ }
370
+
371
+ break;
372
+
373
+ }
374
+
375
+ }
376
+
377
+ // Gamma Evaluation
378
+ if ( params.gamma !== 1 && params.gamma > 0 ) {
379
+
380
+ const invGamma = 1 / params.gamma;
381
+ cr = Math.pow( Math.max( 0, cr ), invGamma );
382
+ cg = Math.pow( Math.max( 0, cg ), invGamma );
383
+ cb = Math.pow( Math.max( 0, cb ), invGamma );
384
+
385
+ }
386
+
387
+ // Clamp to non-negative before Channel Mixer operations
388
+ cr = Math.max( 0, cr );
389
+ cg = Math.max( 0, cg );
390
+ cb = Math.max( 0, cb );
391
+
392
+ // Channel Mixer
393
+ if ( params.channelMixer ) {
394
+
395
+ const cm = params.channelMixer;
396
+ const nr = cr * cm.red.r + cg * cm.red.g + cb * cm.red.b;
397
+ const ng = cr * cm.green.r + cg * cm.green.g + cb * cm.green.b;
398
+ const nb = cr * cm.blue.r + cg * cm.blue.g + cb * cm.blue.b;
399
+
400
+ cr = nr;
401
+ cg = ng;
402
+ cb = nb;
403
+
404
+ }
405
+
406
+ // Clamp before curves evaluation (0..1)
407
+ cr = Math.max( 0, Math.min( 1, cr ) );
408
+ cg = Math.max( 0, Math.min( 1, cg ) );
409
+ cb = Math.max( 0, Math.min( 1, cb ) );
410
+
411
+ // Curves Evaluation
412
+ if ( params.curves ) {
413
+
414
+ // RGB / Master curve
415
+ if ( params.curves.rgb && params.curves.rgb.length > 0 ) {
416
+
417
+ cr = evaluateSpline( cr, params.curves.rgb );
418
+ cg = evaluateSpline( cg, params.curves.rgb );
419
+ cb = evaluateSpline( cb, params.curves.rgb );
420
+
421
+ }
422
+
423
+ // Individual Red, Green, Blue curves
424
+ if ( params.curves.red && params.curves.red.length > 0 ) {
425
+
426
+ cr = evaluateSpline( cr, params.curves.red );
427
+
428
+ }
429
+
430
+ if ( params.curves.green && params.curves.green.length > 0 ) {
431
+
432
+ cg = evaluateSpline( cg, params.curves.green );
433
+
434
+ }
435
+
436
+ if ( params.curves.blue && params.curves.blue.length > 0 ) {
437
+
438
+ cb = evaluateSpline( cb, params.curves.blue );
439
+
440
+ }
441
+
442
+ }
443
+
444
+ // Final clamp (0..1)
445
+ return [
446
+ Math.max( 0, Math.min( 1, cr ) ),
447
+ Math.max( 0, Math.min( 1, cg ) ),
448
+ Math.max( 0, Math.min( 1, cb ) )
449
+ ];
450
+
451
+ }
452
+
453
+ // Generate 3D LUT Float32Array
454
+ export function generate3DLUTData( params, size = 32, buffer = null, pipelineOrder = null ) {
455
+
456
+ if ( buffer === null ) {
457
+
458
+ buffer = new Float32Array( size * size * size * 4 );
459
+
460
+ }
461
+
462
+ let idx = 0;
463
+
464
+ for ( let b = 0; b < size; b ++ ) {
465
+
466
+ for ( let g = 0; g < size; g ++ ) {
467
+
468
+ for ( let r = 0; r < size; r ++ ) {
469
+
470
+ const nr = r / ( size - 1 );
471
+ const ng = g / ( size - 1 );
472
+ const nb = b / ( size - 1 );
473
+
474
+ const [ tr, tg, tb ] = applyColorTransform( nr, ng, nb, params, pipelineOrder );
475
+
476
+ buffer[ idx ++ ] = tr;
477
+ buffer[ idx ++ ] = tg;
478
+ buffer[ idx ++ ] = tb;
479
+ buffer[ idx ++ ] = 1.0; // Alpha
480
+
481
+ }
482
+
483
+ }
484
+
485
+ }
486
+
487
+ return buffer;
488
+
489
+ }
490
+
491
+ // Export Adobe .CUBE file format
492
+ export function exportCubeFormat( paramsOrBuffer, size = 32, title = 'LUT 3D Generator', pipelineOrder = null ) {
493
+
494
+ let output = `#Created by: Three.js ${REVISION} - Color Grading\n`;
495
+ output += `TITLE "${title}"\n`;
496
+ output += `LUT_3D_SIZE ${size}\n\n`;
497
+
498
+ if ( paramsOrBuffer instanceof Float32Array ) {
499
+
500
+ const buffer = paramsOrBuffer;
501
+ for ( let i = 0; i < buffer.length; i += 4 ) {
502
+
503
+ output += `${buffer[ i ].toFixed( 6 )} ${buffer[ i + 1 ].toFixed( 6 )} ${buffer[ i + 2 ].toFixed( 6 )}\n`;
504
+
505
+ }
506
+
507
+ } else {
508
+
509
+ const params = paramsOrBuffer;
510
+
511
+ for ( let b = 0; b < size; b ++ ) {
512
+
513
+ for ( let g = 0; g < size; g ++ ) {
514
+
515
+ for ( let r = 0; r < size; r ++ ) {
516
+
517
+ const nr = r / ( size - 1 );
518
+ const ng = g / ( size - 1 );
519
+ const nb = b / ( size - 1 );
520
+
521
+ const [ tr, tg, tb ] = applyColorTransform( nr, ng, nb, params, pipelineOrder );
522
+
523
+ output += `${tr.toFixed( 6 )} ${tg.toFixed( 6 )} ${tb.toFixed( 6 )}\n`;
524
+
525
+ }
526
+
527
+ }
528
+
529
+ }
530
+
531
+ }
532
+
533
+ return output;
534
+
535
+ }
536
+
537
+ // Parse .CUBE file text into data grid
538
+ export function parseCubeFormat( text ) {
539
+
540
+ const lines = text.split( /\r?\n/ );
541
+ let size = 0;
542
+ let title = 'Imported LUT';
543
+ const dataLines = [];
544
+
545
+ for ( const line of lines ) {
546
+
547
+ const trimmed = line.trim();
548
+ if ( ! trimmed || trimmed.startsWith( '#' ) ) continue;
549
+
550
+ const upper = trimmed.toUpperCase();
551
+ if ( upper.startsWith( 'TITLE' ) ) {
552
+
553
+ const match = trimmed.match( /TITLE\s+"?([^"]+)"?/i );
554
+ if ( match ) title = match[ 1 ];
555
+
556
+ } else if ( upper.startsWith( 'LUT_3D_SIZE' ) ) {
557
+
558
+ const parts = trimmed.split( /\s+/ );
559
+ size = parseInt( parts[ 1 ], 10 );
560
+
561
+ } else if ( upper.startsWith( 'LUT_1D_SIZE' ) || upper.startsWith( 'DOMAIN_MIN' ) || upper.startsWith( 'DOMAIN_MAX' ) ) {
562
+
563
+ continue;
564
+
565
+ } else {
566
+
567
+ const parts = trimmed.split( /\s+/ ).map( Number );
568
+ if ( parts.length >= 3 && ! isNaN( parts[ 0 ] ) && ! isNaN( parts[ 1 ] ) && ! isNaN( parts[ 2 ] ) ) {
569
+
570
+ dataLines.push( [ parts[ 0 ], parts[ 1 ], parts[ 2 ] ] );
571
+
572
+ }
573
+
574
+ }
575
+
576
+ }
577
+
578
+ if ( size === 0 && dataLines.length > 0 ) {
579
+
580
+ size = Math.round( Math.cbrt( dataLines.length ) );
581
+
582
+ }
583
+
584
+ return {
585
+ title,
586
+ size,
587
+ data: dataLines,
588
+ dataLines: dataLines
589
+ };
590
+
591
+ }
592
+
593
+ // Export 2D LUT Canvas for LUTImageLoader (PNG export)
594
+ export function exportLUTCanvas( paramsOrBuffer, size = 32, pipelineOrder = null ) {
595
+
596
+ const canvas = document.createElement( 'canvas' );
597
+ const width = size * size;
598
+ const height = size;
599
+ canvas.width = width;
600
+ canvas.height = height;
601
+
602
+ const ctx = canvas.getContext( '2d' );
603
+ const imgData = ctx.createImageData( width, height );
604
+ const data = imgData.data;
605
+
606
+ if ( paramsOrBuffer instanceof Float32Array ) {
607
+
608
+ const buffer = paramsOrBuffer;
609
+ let idx = 0;
610
+
611
+ for ( let b = 0; b < size; b ++ ) {
612
+
613
+ for ( let g = 0; g < size; g ++ ) {
614
+
615
+ for ( let r = 0; r < size; r ++ ) {
616
+
617
+ const tr = buffer[ idx ++ ];
618
+ const tg = buffer[ idx ++ ];
619
+ const tb = buffer[ idx ++ ];
620
+ idx ++; // skip alpha
621
+
622
+ const x = b * size + r;
623
+ const y = g;
624
+ const pxIdx = ( y * width + x ) * 4;
625
+
626
+ data[ pxIdx ] = Math.round( Math.max( 0, Math.min( 1, tr ) ) * 255 );
627
+ data[ pxIdx + 1 ] = Math.round( Math.max( 0, Math.min( 1, tg ) ) * 255 );
628
+ data[ pxIdx + 2 ] = Math.round( Math.max( 0, Math.min( 1, tb ) ) * 255 );
629
+ data[ pxIdx + 3 ] = 255;
630
+
631
+ }
632
+
633
+ }
634
+
635
+ }
636
+
637
+ } else {
638
+
639
+ const params = paramsOrBuffer;
640
+
641
+ for ( let b = 0; b < size; b ++ ) {
642
+
643
+ for ( let g = 0; g < size; g ++ ) {
644
+
645
+ for ( let r = 0; r < size; r ++ ) {
646
+
647
+ const nr = r / ( size - 1 );
648
+ const ng = g / ( size - 1 );
649
+ const nb = b / ( size - 1 );
650
+
651
+ const [ tr, tg, tb ] = applyColorTransform( nr, ng, nb, params, pipelineOrder );
652
+
653
+ const x = b * size + r;
654
+ const y = g;
655
+ const idx = ( y * width + x ) * 4;
656
+
657
+ data[ idx ] = Math.round( tr * 255 );
658
+ data[ idx + 1 ] = Math.round( tg * 255 );
659
+ data[ idx + 2 ] = Math.round( tb * 255 );
660
+ data[ idx + 3 ] = 255;
661
+
662
+ }
663
+
664
+ }
665
+
666
+ }
667
+
668
+ }
669
+
670
+ ctx.putImageData( imgData, 0, 0 );
671
+ return canvas;
672
+
673
+ }
674
+
675
+
676
+
677
+ // Default Parameter Object factory
678
+ export function createDefaultParams() {
679
+
680
+ return {
681
+ exposure: 0,
682
+ brightness: 0,
683
+ contrast: 1.0,
684
+ contrastPivot: 0.5,
685
+ gamma: 1.0,
686
+ saturation: 1.0,
687
+ vibrance: 0,
688
+ temperature: 0,
689
+ tint: 0,
690
+ hueShift: 0,
691
+ lift: { r: 0, g: 0, b: 0, y: 0 },
692
+ gammaBal: { r: 0, g: 0, b: 0, y: 0 },
693
+ gain: { r: 0, g: 0, b: 0, y: 0 },
694
+ offset: { r: 0, g: 0, b: 0, y: 0 },
695
+ channelMixer: {
696
+ red: { r: 1, g: 0, b: 0 },
697
+ green: { r: 0, g: 1, b: 0 },
698
+ blue: { r: 0, g: 0, b: 1 }
699
+ },
700
+ curves: {
701
+ rgb: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
702
+ red: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
703
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
704
+ blue: [ { x: 0, y: 0 }, { x: 1, y: 1 } ]
705
+ }
706
+ };
707
+
708
+ }
709
+
710
+ // Presets Collection
711
+ export const LUT_PRESETS = {
712
+
713
+ 'Neutral (Default)': createDefaultParams(),
714
+
715
+ 'Cinematic Teal & Orange': {
716
+ ...createDefaultParams(),
717
+ contrast: 1.15,
718
+ temperature: 15,
719
+ lift: { r: - 0.05, g: 0.02, b: 0.08 },
720
+ gain: { r: 0.08, g: 0.03, b: - 0.05 },
721
+ curves: {
722
+ rgb: [ { x: 0, y: 0 }, { x: 0.25, y: 0.2 }, { x: 0.75, y: 0.82 }, { x: 1, y: 1 } ],
723
+ red: [ { x: 0, y: 0 }, { x: 0.5, y: 0.48 }, { x: 1, y: 1 } ],
724
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
725
+ blue: [ { x: 0, y: 0 }, { x: 0.5, y: 0.54 }, { x: 1, y: 1 } ]
726
+ }
727
+ },
728
+
729
+ 'Vintage Warm Film': {
730
+ ...createDefaultParams(),
731
+ exposure: 0.1,
732
+ contrast: 0.92,
733
+ saturation: 0.85,
734
+ temperature: 25,
735
+ tint: 5,
736
+ lift: { r: 0.04, g: 0.02, b: - 0.02 },
737
+ gain: { r: 0.06, g: 0.04, b: - 0.04 },
738
+ curves: {
739
+ rgb: [ { x: 0, y: 0.05 }, { x: 0.5, y: 0.5 }, { x: 1, y: 0.95 } ],
740
+ red: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
741
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
742
+ blue: [ { x: 0, y: 0.06 }, { x: 1, y: 0.9 } ]
743
+ }
744
+ },
745
+
746
+ 'Cold Sci-Fi Blue': {
747
+ ...createDefaultParams(),
748
+ contrast: 1.2,
749
+ temperature: - 35,
750
+ tint: - 10,
751
+ lift: { r: - 0.04, g: - 0.01, b: 0.06 },
752
+ gain: { r: - 0.06, g: 0.02, b: 0.1 },
753
+ curves: {
754
+ rgb: [ { x: 0, y: 0 }, { x: 0.3, y: 0.22 }, { x: 0.7, y: 0.78 }, { x: 1, y: 1 } ],
755
+ red: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
756
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
757
+ blue: [ { x: 0, y: 0 }, { x: 1, y: 1 } ]
758
+ }
759
+ },
760
+
761
+ 'Cyberpunk Neon': {
762
+ ...createDefaultParams(),
763
+ contrast: 1.25,
764
+ saturation: 1.3,
765
+ vibrance: 0.4,
766
+ lift: { r: 0.06, g: - 0.04, b: 0.12 },
767
+ gain: { r: 0.1, g: - 0.02, b: 0.08 },
768
+ curves: {
769
+ rgb: [ { x: 0, y: 0 }, { x: 0.2, y: 0.15 }, { x: 0.8, y: 0.88 }, { x: 1, y: 1 } ],
770
+ red: [ { x: 0, y: 0 }, { x: 0.5, y: 0.55 }, { x: 1, y: 1 } ],
771
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
772
+ blue: [ { x: 0, y: 0.05 }, { x: 0.5, y: 0.6 }, { x: 1, y: 1 } ]
773
+ }
774
+ },
775
+
776
+ 'High Contrast B&W': {
777
+ ...createDefaultParams(),
778
+ contrast: 1.35,
779
+ saturation: 0.0,
780
+ curves: {
781
+ rgb: [ { x: 0, y: 0 }, { x: 0.25, y: 0.15 }, { x: 0.75, y: 0.88 }, { x: 1, y: 1 } ],
782
+ red: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
783
+ green: [ { x: 0, y: 0 }, { x: 1, y: 1 } ],
784
+ blue: [ { x: 0, y: 0 }, { x: 1, y: 1 } ]
785
+ }
786
+ }
787
+
788
+ };