super-three 0.165.0 → 0.167.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/build/three.cjs +706 -383
  2. package/build/three.module.js +702 -384
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +76086 -0
  5. package/build/three.webgpu.min.js +6 -0
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/csm/CSMShader.js +4 -4
  8. package/examples/jsm/exporters/GLTFExporter.js +7 -3
  9. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  10. package/examples/jsm/helpers/ViewHelper.js +51 -2
  11. package/examples/jsm/libs/tween.module.js +64 -75
  12. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  13. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  14. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  15. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  16. package/examples/jsm/loaders/FBXLoader.js +23 -45
  17. package/examples/jsm/loaders/GLTFLoader.js +10 -4
  18. package/examples/jsm/loaders/MaterialXLoader.js +2 -9
  19. package/examples/jsm/loaders/USDZLoader.js +124 -76
  20. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  21. package/examples/jsm/loaders/VTKLoader.js +76 -3
  22. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  23. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  24. package/examples/jsm/objects/InstancedPoints.js +2 -2
  25. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  26. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  27. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  28. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  29. package/examples/jsm/shaders/FXAAShader.js +0 -2
  30. package/examples/jsm/shaders/GTAOShader.js +1 -1
  31. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  32. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  33. package/examples/jsm/transpiler/TSLEncoder.js +17 -15
  34. package/package.json +7 -6
  35. package/src/Three.WebGPU.js +194 -0
  36. package/src/Three.js +2 -0
  37. package/src/constants.js +4 -1
  38. package/src/core/Object3D.js +22 -22
  39. package/src/extras/TextureUtils.js +210 -0
  40. package/src/lights/Light.js +1 -0
  41. package/src/lights/LightShadow.js +5 -0
  42. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  43. package/src/loaders/ObjectLoader.js +33 -2
  44. package/src/materials/Material.js +13 -4
  45. package/src/math/Box2.js +4 -4
  46. package/src/math/Box3.js +6 -6
  47. package/src/math/ColorManagement.js +10 -0
  48. package/src/math/Matrix2.js +54 -0
  49. package/src/math/Vector4.js +13 -0
  50. package/{examples/jsm → src}/nodes/Nodes.js +30 -12
  51. package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
  52. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
  53. package/src/nodes/accessors/CameraNode.js +19 -0
  54. package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
  55. package/src/nodes/accessors/InstanceNode.js +140 -0
  56. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +22 -2
  57. package/{examples/jsm → src}/nodes/accessors/ModelNode.js +2 -1
  58. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
  59. package/{examples/jsm → src}/nodes/accessors/NormalNode.js +1 -1
  60. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
  61. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +1 -1
  62. package/{examples/jsm → src}/nodes/accessors/ReflectVectorNode.js +4 -0
  63. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
  64. package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +12 -3
  65. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
  66. package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
  67. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
  68. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
  69. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
  70. package/{examples/jsm → src}/nodes/core/AttributeNode.js +20 -6
  71. package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
  72. package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
  73. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  74. package/src/nodes/core/MRTNode.js +76 -0
  75. package/{examples/jsm → src}/nodes/core/Node.js +18 -12
  76. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +175 -37
  77. package/src/nodes/core/NodeCache.js +36 -0
  78. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  79. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  80. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  81. package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
  82. package/{examples/jsm → src}/nodes/core/PropertyNode.js +1 -0
  83. package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
  84. package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
  85. package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
  86. package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
  87. package/{examples/jsm → src}/nodes/core/VaryingNode.js +8 -0
  88. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +19 -27
  89. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
  90. package/src/nodes/display/BloomNode.js +333 -0
  91. package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
  92. package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
  93. package/src/nodes/display/DenoiseNode.js +198 -0
  94. package/src/nodes/display/DepthOfFieldNode.js +119 -0
  95. package/src/nodes/display/DotScreenNode.js +75 -0
  96. package/src/nodes/display/FXAANode.js +327 -0
  97. package/src/nodes/display/FilmNode.js +52 -0
  98. package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
  99. package/src/nodes/display/GTAONode.js +324 -0
  100. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
  101. package/src/nodes/display/Lut3DNode.js +53 -0
  102. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
  103. package/src/nodes/display/PassNode.js +291 -0
  104. package/src/nodes/display/PixelationPassNode.js +201 -0
  105. package/src/nodes/display/RGBShiftNode.js +49 -0
  106. package/src/nodes/display/RenderOutputNode.js +56 -0
  107. package/src/nodes/display/SobelOperatorNode.js +121 -0
  108. package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
  109. package/src/nodes/display/TransitionNode.js +76 -0
  110. package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
  111. package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
  112. package/{examples/jsm → src}/nodes/display/ViewportNode.js +2 -1
  113. package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
  114. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
  115. package/src/nodes/functions/BSDF/LTC.js +131 -0
  116. package/src/nodes/functions/BasicLightingModel.js +78 -0
  117. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
  118. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +42 -1
  119. package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +3 -1
  120. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
  121. package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
  122. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
  123. package/src/nodes/lighting/AnalyticLightNode.js +333 -0
  124. package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
  125. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  126. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
  127. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
  128. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
  129. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
  130. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
  131. package/{examples/jsm → src}/nodes/lighting/LightsNode.js +1 -3
  132. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
  133. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  134. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
  135. package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
  136. package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
  137. package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
  138. package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  139. package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +3 -3
  140. package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
  141. package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
  142. package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
  143. package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
  144. package/{examples/jsm → src}/nodes/materials/MeshMatcapNodeMaterial.js +6 -5
  145. package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
  146. package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
  147. package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +5 -4
  148. package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
  149. package/{examples/jsm → src}/nodes/materials/MeshToonNodeMaterial.js +3 -3
  150. package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +85 -20
  151. package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
  152. package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
  153. package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
  154. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
  155. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
  156. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
  157. package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
  158. package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
  159. package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
  160. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  161. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
  162. package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +2 -0
  163. package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
  164. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
  165. package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
  166. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
  167. package/src/nodes/utils/RTTNode.js +130 -0
  168. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
  169. package/src/objects/BatchedMesh.js +168 -188
  170. package/src/objects/InstancedMesh.js +1 -1
  171. package/src/renderers/WebGLRenderer.js +38 -25
  172. package/{examples/jsm → src}/renderers/common/Attributes.js +2 -1
  173. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  174. package/{examples/jsm → src}/renderers/common/Background.js +9 -3
  175. package/src/renderers/common/BindGroup.js +16 -0
  176. package/{examples/jsm → src}/renderers/common/Bindings.js +38 -23
  177. package/{examples/jsm → src}/renderers/common/ClippingContext.js +4 -2
  178. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  179. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
  180. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  181. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  182. package/src/renderers/common/PostProcessing.js +87 -0
  183. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
  184. package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
  185. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  186. package/{examples/jsm → src}/renderers/common/RenderObject.js +44 -11
  187. package/{examples/jsm → src}/renderers/common/Renderer.js +84 -32
  188. package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
  189. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  190. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  191. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  192. package/{examples/jsm → src}/renderers/common/Textures.js +6 -2
  193. package/{examples/jsm → src}/renderers/common/Uniform.js +9 -4
  194. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  195. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
  196. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  197. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +6 -5
  198. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -1
  199. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  200. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  201. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  202. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  203. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +37 -16
  204. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +16 -1
  205. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  206. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -1
  207. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  208. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  209. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  210. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  211. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  212. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  213. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  214. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  215. package/src/renderers/shaders/UniformsLib.js +3 -0
  216. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  217. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  218. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  219. package/src/renderers/webgl/WebGLLights.js +6 -0
  220. package/src/renderers/webgl/WebGLProgram.js +26 -0
  221. package/src/renderers/webgl/WebGLPrograms.js +1 -1
  222. package/src/renderers/webgl/WebGLTextures.js +14 -53
  223. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  224. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  225. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
  226. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +178 -43
  227. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  228. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  229. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  230. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +1 -1
  231. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +34 -2
  232. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  233. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +164 -76
  234. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
  235. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +194 -56
  236. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  237. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  238. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +20 -13
  239. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +3 -1
  240. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +28 -21
  241. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +40 -23
  242. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
  243. package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
  244. package/src/renderers/webxr/WebXRManager.js +6 -0
  245. package/src/textures/CompressedArrayTexture.js +1 -1
  246. package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
  247. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  248. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  249. package/examples/jsm/nodes/display/PassNode.js +0 -201
  250. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
  251. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  252. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  253. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  254. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  255. /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
  256. /package/{examples/jsm → src}/nodes/accessors/BitangentNode.js +0 -0
  257. /package/{examples/jsm → src}/nodes/accessors/BufferNode.js +0 -0
  258. /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
  259. /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
  260. /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
  261. /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
  262. /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
  263. /package/{examples/jsm → src}/nodes/accessors/PositionNode.js +0 -0
  264. /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
  265. /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
  266. /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
  267. /package/{examples/jsm → src}/nodes/accessors/TangentNode.js +0 -0
  268. /package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +0 -0
  269. /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
  270. /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
  271. /package/{examples/jsm → src}/nodes/accessors/UVNode.js +0 -0
  272. /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
  273. /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
  274. /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
  275. /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
  276. /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
  277. /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
  278. /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
  279. /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
  280. /package/{examples/jsm → src}/nodes/core/ContextNode.js +0 -0
  281. /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
  282. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  283. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  284. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  285. /package/{examples/jsm → src}/nodes/core/NodeKeywords.js +0 -0
  286. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  287. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  288. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  289. /package/{examples/jsm → src}/nodes/core/OutputStructNode.js +0 -0
  290. /package/{examples/jsm → src}/nodes/core/ParameterNode.js +0 -0
  291. /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
  292. /package/{examples/jsm → src}/nodes/core/StructTypeNode.js +0 -0
  293. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  294. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  295. /package/{examples/jsm → src}/nodes/display/BlendModeNode.js +0 -0
  296. /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
  297. /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
  298. /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
  299. /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
  300. /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
  301. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
  302. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
  303. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
  304. /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
  305. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
  306. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
  307. /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
  308. /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
  309. /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
  310. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
  311. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
  312. /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
  313. /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
  314. /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
  315. /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
  316. /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
  317. /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
  318. /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
  319. /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
  320. /package/{examples/jsm → src}/nodes/materials/Materials.js +0 -0
  321. /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
  322. /package/{examples/jsm → src}/nodes/materials/VolumeNodeMaterial.js +0 -0
  323. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  324. /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
  325. /package/{examples/jsm → src}/nodes/math/HashNode.js +0 -0
  326. /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
  327. /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
  328. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  329. /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
  330. /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
  331. /package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +0 -0
  332. /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
  333. /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
  334. /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
  335. /package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +0 -0
  336. /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
  337. /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
  338. /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
  339. /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
  340. /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
  341. /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
  342. /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
  343. /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
  344. /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
  345. /package/{examples/jsm → src}/nodes/utils/TimerNode.js +0 -0
  346. /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
  347. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  348. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  349. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  350. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  351. /package/{examples/jsm → src}/renderers/common/ChainMap.js +0 -0
  352. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  353. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  354. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  355. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  356. /package/{examples/jsm → src}/renderers/common/Pipelines.js +0 -0
  357. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  358. /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
  359. /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
  360. /package/{examples/jsm → src}/renderers/common/RenderList.js +0 -0
  361. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  362. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  363. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  364. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  365. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  366. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  367. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  368. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  369. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
  370. /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +0 -0
@@ -0,0 +1,327 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { uv } from '../accessors/UVNode.js';
3
+ import { addNodeElement, tslFn, nodeObject, float, vec2, vec4, int, If } from '../shadernode/ShaderNode.js';
4
+ import { NodeUpdateType } from '../core/constants.js';
5
+ import { uniform } from '../core/UniformNode.js';
6
+ import { abs, max, min, mix, pow } from '../math/MathNode.js';
7
+ import { sub } from '../math/OperatorNode.js';
8
+ import { loop, Break } from '../utils/LoopNode.js';
9
+
10
+ import { Vector2 } from '../../math/Vector2.js';
11
+
12
+ class FXAANode extends TempNode {
13
+
14
+ constructor( textureNode ) {
15
+
16
+ super();
17
+
18
+ this.textureNode = textureNode;
19
+
20
+ this.updateBeforeType = NodeUpdateType.RENDER;
21
+
22
+ this._invSize = uniform( new Vector2() );
23
+
24
+ }
25
+
26
+ updateBefore() {
27
+
28
+ const map = this.textureNode.value;
29
+
30
+ this._invSize.value.set( 1 / map.image.width, 1 / map.image.height );
31
+
32
+ }
33
+
34
+ setup() {
35
+
36
+ const textureNode = this.textureNode.bias( - 100 );
37
+ const uvNode = textureNode.uvNode || uv();
38
+
39
+ // FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)
40
+
41
+ //----------------------------------------------------------------------------------
42
+ // File: es3-kepler\FXAA\assets\shaders/FXAA_DefaultES.frag
43
+ // SDK Version: v3.00
44
+ // Email: gameworks@nvidia.com
45
+ // Site: http://developer.nvidia.com/
46
+ //
47
+ // Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
48
+ //
49
+ // Redistribution and use in source and binary forms, with or without
50
+ // modification, are permitted provided that the following conditions
51
+ // are met:
52
+ // * Redistributions of source code must retain the above copyright
53
+ // notice, this list of conditions and the following disclaimer.
54
+ // * Redistributions in binary form must reproduce the above copyright
55
+ // notice, this list of conditions and the following disclaimer in the
56
+ // documentation and/or other materials provided with the distribution.
57
+ // * Neither the name of NVIDIA CORPORATION nor the names of its
58
+ // contributors may be used to endorse or promote products derived
59
+ // from this software without specific prior written permission.
60
+ //
61
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
62
+ // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
63
+ // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
64
+ // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
65
+ // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
66
+ // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
67
+ // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
68
+ // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
69
+ // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
70
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
71
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
72
+ //
73
+ //----------------------------------------------------------------------------------
74
+
75
+ const FxaaTexTop = ( p ) => textureNode.uv( p );
76
+ const FxaaTexOff = ( p, o, r ) => textureNode.uv( p.add( o.mul( r ) ) );
77
+
78
+ const NUM_SAMPLES = int( 5 );
79
+
80
+ const contrast = tslFn( ( [ a_immutable, b_immutable ] ) => {
81
+
82
+ // assumes colors have premultipliedAlpha, so that the calculated color contrast is scaled by alpha
83
+
84
+ const b = vec4( b_immutable ).toVar();
85
+ const a = vec4( a_immutable ).toVar();
86
+ const diff = vec4( abs( a.sub( b ) ) ).toVar();
87
+
88
+ return max( max( max( diff.r, diff.g ), diff.b ), diff.a );
89
+
90
+ } );
91
+
92
+ // FXAA3 QUALITY - PC
93
+
94
+ const FxaaPixelShader = tslFn( ( [ uv, fxaaQualityRcpFrame, fxaaQualityEdgeThreshold, fxaaQualityinvEdgeThreshold ] ) => {
95
+
96
+ const rgbaM = FxaaTexTop( uv ).toVar();
97
+ const rgbaS = FxaaTexOff( uv, vec2( 0.0, - 1.0 ), fxaaQualityRcpFrame.xy ).toVar();
98
+ const rgbaE = FxaaTexOff( uv, vec2( 1.0, 0.0 ), fxaaQualityRcpFrame.xy ).toVar();
99
+ const rgbaN = FxaaTexOff( uv, vec2( 0.0, 1.0 ), fxaaQualityRcpFrame.xy ).toVar();
100
+ const rgbaW = FxaaTexOff( uv, vec2( - 1.0, 0.0 ), fxaaQualityRcpFrame.xy ).toVar();
101
+ // . S .
102
+ // W M E
103
+ // . N .
104
+
105
+ const contrastN = contrast( rgbaM, rgbaN ).toVar();
106
+ const contrastS = contrast( rgbaM, rgbaS ).toVar();
107
+ const contrastE = contrast( rgbaM, rgbaE ).toVar();
108
+ const contrastW = contrast( rgbaM, rgbaW ).toVar();
109
+
110
+ const maxValue = max( contrastN, max( contrastS, max( contrastE, contrastW ) ) ).toVar();
111
+
112
+ // . 0 .
113
+ // 0 0 0
114
+ // . 0 .
115
+
116
+ If( maxValue.lessThan( fxaaQualityEdgeThreshold ), () => {
117
+
118
+ return rgbaM; // assuming define FXAA_DISCARD is always 0
119
+
120
+ } );
121
+
122
+ //
123
+
124
+ const relativeVContrast = sub( contrastN.add( contrastS ), ( contrastE.add( contrastW ) ) ).toVar();
125
+ relativeVContrast.mulAssign( fxaaQualityinvEdgeThreshold );
126
+
127
+ // 45 deg edge detection and corners of objects, aka V/H contrast is too similar
128
+
129
+ If( abs( relativeVContrast ).lessThan( 0.3 ), () => {
130
+
131
+ // locate the edge
132
+
133
+ const x = contrastE.greaterThan( contrastW ).cond( 1, - 1 ).toVar();
134
+ const y = contrastS.greaterThan( contrastN ).cond( 1, - 1 ).toVar();
135
+
136
+ const dirToEdge = vec2( x, y ).toVar();
137
+ // . 2 . . 1 .
138
+ // 1 0 2 ~= 0 0 1
139
+ // . 1 . . 0 .
140
+
141
+ // tap 2 pixels and see which ones are "outside" the edge, to
142
+ // determine if the edge is vertical or horizontal
143
+
144
+ const rgbaAlongH = FxaaTexOff( uv, vec2( dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy );
145
+ const matchAlongH = contrast( rgbaM, rgbaAlongH ).toVar();
146
+ // . 1 .
147
+ // 0 0 1
148
+ // . 0 H
149
+
150
+ const rgbaAlongV = FxaaTexOff( uv, vec2( dirToEdge.x.negate(), dirToEdge.y.negate() ), fxaaQualityRcpFrame.xy );
151
+ const matchAlongV = contrast( rgbaM, rgbaAlongV ).toVar();
152
+ // V 1 .
153
+ // 0 0 1
154
+ // . 0 .
155
+
156
+ relativeVContrast.assign( matchAlongV.sub( matchAlongH ) );
157
+ relativeVContrast.mulAssign( fxaaQualityinvEdgeThreshold );
158
+
159
+ If( abs( relativeVContrast ).lessThan( 0.3 ), () => { // 45 deg edge
160
+
161
+ // 1 1 .
162
+ // 0 0 1
163
+ // . 0 1
164
+
165
+ // do a simple blur
166
+ const sum = rgbaN.add( rgbaS ).add( rgbaE ).add( rgbaW );
167
+ return mix( rgbaM, sum.mul( 0.25 ), 0.4 );
168
+
169
+ } );
170
+
171
+ } );
172
+
173
+ const offNP = vec2().toVar();
174
+
175
+ If( relativeVContrast.lessThanEqual( 0 ), () => {
176
+
177
+ rgbaN.assign( rgbaW );
178
+ rgbaS.assign( rgbaE );
179
+
180
+ // . 0 . 1
181
+ // 1 0 1 -> 0
182
+ // . 0 . 1
183
+
184
+ offNP.x.assign( 0 );
185
+ offNP.y.assign( fxaaQualityRcpFrame.y );
186
+
187
+ } ).else( () => {
188
+
189
+ offNP.x.assign( fxaaQualityRcpFrame.x );
190
+ offNP.y.assign( 0 );
191
+
192
+ } );
193
+
194
+ const mn = contrast( rgbaM, rgbaN ).toVar();
195
+ const ms = contrast( rgbaM, rgbaS ).toVar();
196
+
197
+ If( mn.lessThanEqual( ms ), () => {
198
+
199
+ rgbaN.assign( rgbaS );
200
+
201
+ } );
202
+
203
+ const doneN = int( 0 ).toVar();
204
+ const doneP = int( 0 ).toVar();
205
+
206
+ const nDist = float( 0 ).toVar();
207
+ const pDist = float( 0 ).toVar();
208
+
209
+ const posN = vec2( uv ).toVar();
210
+ const posP = vec2( uv ).toVar();
211
+
212
+ const iterationsUsedN = int( 0 ).toVar();
213
+ const iterationsUsedP = int( 0 ).toVar();
214
+
215
+ loop( NUM_SAMPLES, ( { i } ) => {
216
+
217
+ const increment = i.add( 1 ).toVar();
218
+
219
+ If( doneN.equal( 0 ), () => {
220
+
221
+ nDist.addAssign( increment );
222
+ posN.assign( uv.add( offNP.mul( nDist ) ) );
223
+ const rgbaEndN = FxaaTexTop( posN.xy );
224
+
225
+ const nm = contrast( rgbaEndN, rgbaM ).toVar();
226
+ const nn = contrast( rgbaEndN, rgbaN ).toVar();
227
+
228
+ If( nm.greaterThan( nn ), () => {
229
+
230
+ doneN.assign( 1 );
231
+
232
+ } );
233
+
234
+ iterationsUsedN.assign( i );
235
+
236
+ } );
237
+
238
+ If( doneP.equal( 0 ), () => {
239
+
240
+ pDist.addAssign( increment );
241
+ posP.assign( uv.sub( offNP.mul( pDist ) ) );
242
+ const rgbaEndP = FxaaTexTop( posP.xy );
243
+
244
+ const pm = contrast( rgbaEndP, rgbaM ).toVar();
245
+ const pn = contrast( rgbaEndP, rgbaN ).toVar();
246
+
247
+ If( pm.greaterThan( pn ), () => {
248
+
249
+ doneP.assign( 1 );
250
+
251
+ } );
252
+
253
+ iterationsUsedP.assign( i );
254
+
255
+ } );
256
+
257
+ If( doneN.equal( 1 ).or( doneP.equal( 1 ) ), () => {
258
+
259
+ Break();
260
+
261
+ } );
262
+
263
+ } );
264
+
265
+ If( doneN.equal( 0 ).and( doneP.equal( 0 ) ), () => {
266
+
267
+ return rgbaM; // failed to find end of edge
268
+
269
+ } );
270
+
271
+ const distN = float( 1 ).toVar();
272
+ const distP = float( 1 ).toVar();
273
+
274
+ If( doneN.equal( 1 ), () => {
275
+
276
+ distN.assign( float( iterationsUsedN ).div( float( NUM_SAMPLES.sub( 1 ) ) ) );
277
+
278
+ } );
279
+
280
+ If( doneP.equal( 1 ), () => {
281
+
282
+ distP.assign( float( iterationsUsedP ).div( float( NUM_SAMPLES.sub( 1 ) ) ) );
283
+
284
+ } );
285
+
286
+ const dist = min( distN, distP );
287
+
288
+ // hacky way of reduces blurriness of mostly diagonal edges
289
+ // but reduces AA quality
290
+ dist.assign( pow( dist, 0.5 ) );
291
+ dist.assign( float( 1 ).sub( dist ) );
292
+
293
+ return mix( rgbaM, rgbaN, dist.mul( 0.5 ) );
294
+
295
+ } ).setLayout( {
296
+ name: 'FxaaPixelShader',
297
+ type: 'vec4',
298
+ inputs: [
299
+ { name: 'uv', type: 'vec2' },
300
+ { name: 'fxaaQualityRcpFrame', type: 'vec2' },
301
+ { name: 'fxaaQualityEdgeThreshold', type: 'float' },
302
+ { name: 'fxaaQualityinvEdgeThreshold', type: 'float' },
303
+ ]
304
+ } );
305
+
306
+ const fxaa = tslFn( () => {
307
+
308
+ const edgeDetectionQuality = float( 0.2 );
309
+ const invEdgeDetectionQuality = float( 1 ).div( edgeDetectionQuality );
310
+
311
+ return FxaaPixelShader( uvNode, this._invSize, edgeDetectionQuality, invEdgeDetectionQuality );
312
+
313
+ } );
314
+
315
+ const outputNode = fxaa();
316
+
317
+ return outputNode;
318
+
319
+ }
320
+
321
+ }
322
+
323
+ export const fxaa = ( node ) => nodeObject( new FXAANode( nodeObject( node ).toTexture() ) );
324
+
325
+ addNodeElement( 'fxaa', fxaa );
326
+
327
+ export default FXAANode;
@@ -0,0 +1,52 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { uv } from '../accessors/UVNode.js';
3
+ import { addNodeElement, tslFn, nodeProxy, vec4 } from '../shadernode/ShaderNode.js';
4
+ import { mix, fract, clamp, rand } from '../math/MathNode.js';
5
+ import { timerLocal } from '../utils/TimerNode.js';
6
+
7
+ class FilmNode extends TempNode {
8
+
9
+ constructor( inputNode, intensityNode = null, uvNode = null ) {
10
+
11
+ super();
12
+
13
+ this.inputNode = inputNode;
14
+ this.intensityNode = intensityNode;
15
+ this.uvNode = uvNode;
16
+
17
+ }
18
+
19
+ setup() {
20
+
21
+ const uvNode = this.uvNode || uv();
22
+
23
+ const film = tslFn( () => {
24
+
25
+ const base = this.inputNode.rgb;
26
+ const noise = rand( fract( uvNode.add( timerLocal() ) ) );
27
+
28
+ let color = base.add( base.mul( clamp( noise.add( 0.1 ), 0, 1 ) ) );
29
+
30
+ if ( this.intensityNode !== null ) {
31
+
32
+ color = mix( base, color, this.intensityNode );
33
+
34
+ }
35
+
36
+ return vec4( color, this.inputNode.a );
37
+
38
+ } );
39
+
40
+ const outputNode = film();
41
+
42
+ return outputNode;
43
+
44
+ }
45
+
46
+ }
47
+
48
+ export const film = nodeProxy( FilmNode );
49
+
50
+ addNodeElement( 'film', film );
51
+
52
+ export default FilmNode;
@@ -1,6 +1,7 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { nodeImmutable, float } from '../shadernode/ShaderNode.js';
3
- import { BackSide, WebGLCoordinateSystem } from 'three';
3
+
4
+ import { BackSide, WebGLCoordinateSystem } from '../../constants.js';
4
5
 
5
6
  class FrontFacingNode extends Node {
6
7
 
@@ -0,0 +1,324 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { texture } from '../accessors/TextureNode.js';
3
+ import { textureSize } from '../accessors/TextureSizeNode.js';
4
+ import { uv } from '../accessors/UVNode.js';
5
+ import { addNodeElement, nodeObject, tslFn, mat3, vec2, vec3, vec4, float, int, If } from '../shadernode/ShaderNode.js';
6
+ import { NodeUpdateType } from '../core/constants.js';
7
+ import { uniform } from '../core/UniformNode.js';
8
+ import { DataTexture } from '../../textures/DataTexture.js';
9
+ import { Vector2 } from '../../math/Vector2.js';
10
+ import { Vector3 } from '../../math/Vector3.js';
11
+ import { PI, cos, sin, pow, clamp, abs, max, mix, sqrt, acos, dot, normalize, cross } from '../math/MathNode.js';
12
+ import { div, mul, add, sub } from '../math/OperatorNode.js';
13
+ import { loop } from '../utils/LoopNode.js';
14
+ import { passTexture } from './PassNode.js';
15
+ import { RepeatWrapping } from '../../constants.js';
16
+ import QuadMesh from '../../renderers/common/QuadMesh.js';
17
+ import { RenderTarget } from '../../core/RenderTarget.js';
18
+ import { Color } from '../../math/Color.js';
19
+
20
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
21
+ const _currentClearColor = /*@__PURE__*/ new Color();
22
+ const _size = /*@__PURE__*/ new Vector2();
23
+
24
+ class GTAONode extends TempNode {
25
+
26
+ constructor( depthNode, normalNode, camera ) {
27
+
28
+ super();
29
+
30
+ this.depthNode = depthNode;
31
+ this.normalNode = normalNode;
32
+
33
+ this.radius = uniform( 0.25 );
34
+ this.resolution = uniform( new Vector2() );
35
+ this.thickness = uniform( 1 );
36
+ this.distanceExponent = uniform( 1 );
37
+ this.distanceFallOff = uniform( 1 );
38
+ this.scale = uniform( 1 );
39
+ this.noiseNode = texture( generateMagicSquareNoise() );
40
+
41
+ this.cameraProjectionMatrix = uniform( camera.projectionMatrix );
42
+ this.cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
43
+
44
+ this.SAMPLES = uniform( 16 );
45
+
46
+ this._aoRenderTarget = new RenderTarget();
47
+ this._aoRenderTarget.texture.name = 'GTAONode.AO';
48
+
49
+ this._material = null;
50
+ this._textureNode = passTexture( this, this._aoRenderTarget.texture );
51
+
52
+ this.updateBeforeType = NodeUpdateType.FRAME;
53
+
54
+ }
55
+
56
+ getTextureNode() {
57
+
58
+ return this._textureNode;
59
+
60
+ }
61
+
62
+ setSize( width, height ) {
63
+
64
+ this.resolution.value.set( width, height );
65
+ this._aoRenderTarget.setSize( width, height );
66
+
67
+ }
68
+
69
+ updateBefore( frame ) {
70
+
71
+ const { renderer } = frame;
72
+
73
+ const size = renderer.getDrawingBufferSize( _size );
74
+
75
+ const currentRenderTarget = renderer.getRenderTarget();
76
+ const currentMRT = renderer.getMRT();
77
+ renderer.getClearColor( _currentClearColor );
78
+ const currentClearAlpha = renderer.getClearAlpha();
79
+
80
+ _quadMesh.material = this._material;
81
+
82
+ this.setSize( size.width, size.height );
83
+
84
+ // clear
85
+
86
+ renderer.setMRT( null );
87
+ renderer.setClearColor( 0xffffff, 1 );
88
+
89
+ // ao
90
+
91
+ renderer.setRenderTarget( this._aoRenderTarget );
92
+ _quadMesh.render( renderer );
93
+
94
+ // restore
95
+
96
+ renderer.setRenderTarget( currentRenderTarget );
97
+ renderer.setMRT( currentMRT );
98
+ renderer.setClearColor( _currentClearColor, currentClearAlpha );
99
+
100
+ }
101
+
102
+ setup( builder ) {
103
+
104
+ const uvNode = uv();
105
+
106
+ const sampleDepth = ( uv ) => this.depthNode.uv( uv ).x;
107
+ const sampleNoise = ( uv ) => this.noiseNode.uv( uv );
108
+
109
+ const getSceneUvAndDepth = tslFn( ( [ sampleViewPos ] )=> {
110
+
111
+ const sampleClipPos = this.cameraProjectionMatrix.mul( vec4( sampleViewPos, 1.0 ) );
112
+ let sampleUv = sampleClipPos.xy.div( sampleClipPos.w ).mul( 0.5 ).add( 0.5 ).toVar();
113
+ sampleUv = vec2( sampleUv.x, sampleUv.y.oneMinus() );
114
+ const sampleSceneDepth = sampleDepth( sampleUv );
115
+ return vec3( sampleUv, sampleSceneDepth );
116
+
117
+ } );
118
+
119
+ const getViewPosition = tslFn( ( [ screenPosition, depth ] ) => {
120
+
121
+ screenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );
122
+
123
+ const clipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );
124
+ const viewSpacePosition = vec4( this.cameraProjectionMatrixInverse.mul( clipSpacePosition ) );
125
+
126
+ return viewSpacePosition.xyz.div( viewSpacePosition.w );
127
+
128
+ } );
129
+
130
+ const ao = tslFn( () => {
131
+
132
+ const depth = sampleDepth( uvNode );
133
+
134
+ depth.greaterThanEqual( 1.0 ).discard();
135
+
136
+ const viewPosition = getViewPosition( uvNode, depth );
137
+ const viewNormal = this.normalNode.rgb.normalize();
138
+
139
+ const radiusToUse = this.radius;
140
+
141
+ const noiseResolution = textureSize( this.noiseNode, 0 );
142
+ let noiseUv = vec2( uvNode.x, uvNode.y.oneMinus() );
143
+ noiseUv = noiseUv.mul( this.resolution.div( noiseResolution ) );
144
+ const noiseTexel = sampleNoise( noiseUv );
145
+ const randomVec = noiseTexel.xyz.mul( 2.0 ).sub( 1.0 );
146
+ const tangent = vec3( randomVec.xy, 0.0 ).normalize();
147
+ const bitangent = vec3( tangent.y.mul( - 1.0 ), tangent.x, 0.0 );
148
+ const kernelMatrix = mat3( tangent, bitangent, vec3( 0.0, 0.0, 1.0 ) );
149
+
150
+ const DIRECTIONS = this.SAMPLES.lessThan( 30 ).cond( 3, 5 );
151
+ const STEPS = add( this.SAMPLES, DIRECTIONS.sub( 1 ) ).div( DIRECTIONS );
152
+
153
+ const ao = float( 0 ).toVar();
154
+
155
+ loop( { start: int( 0 ), end: DIRECTIONS, type: 'int', condition: '<' }, ( { i } ) => {
156
+
157
+ const angle = float( i ).div( float( DIRECTIONS ) ).mul( PI );
158
+ const sampleDir = vec4( cos( angle ), sin( angle ), 0., add( 0.5, mul( 0.5, noiseTexel.w ) ) );
159
+ sampleDir.xyz = normalize( kernelMatrix.mul( sampleDir.xyz ) );
160
+
161
+ const viewDir = normalize( viewPosition.xyz.negate() );
162
+ const sliceBitangent = normalize( cross( sampleDir.xyz, viewDir ) );
163
+ const sliceTangent = cross( sliceBitangent, viewDir );
164
+ const normalInSlice = normalize( viewNormal.sub( sliceBitangent.mul( dot( viewNormal, sliceBitangent ) ) ) );
165
+
166
+ const tangentToNormalInSlice = cross( normalInSlice, sliceBitangent );
167
+ const cosHorizons = vec2( dot( viewDir, tangentToNormalInSlice ), dot( viewDir, tangentToNormalInSlice.negate() ) ).toVar();
168
+
169
+ loop( { end: STEPS, type: 'int', name: 'j', condition: '<' }, ( { j } ) => {
170
+
171
+ const sampleViewOffset = sampleDir.xyz.mul( radiusToUse ).mul( sampleDir.w ).mul( pow( div( float( j ).add( 1.0 ), float( STEPS ) ), this.distanceExponent ) );
172
+
173
+ // x
174
+
175
+ const sampleSceneUvDepthX = getSceneUvAndDepth( viewPosition.add( sampleViewOffset ) );
176
+ const sampleSceneViewPositionX = getViewPosition( sampleSceneUvDepthX.xy, sampleSceneUvDepthX.z );
177
+ const viewDeltaX = sampleSceneViewPositionX.sub( viewPosition );
178
+
179
+ If( abs( viewDeltaX.z ).lessThan( this.thickness ), () => {
180
+
181
+ const sampleCosHorizon = dot( viewDir, normalize( viewDeltaX ) );
182
+ cosHorizons.x.addAssign( max( 0, mul( sampleCosHorizon.sub( cosHorizons.x ), mix( 1.0, float( 2.0 ).div( float( j ).add( 2 ) ), this.distanceFallOff ) ) ) );
183
+
184
+ } );
185
+
186
+ // y
187
+
188
+ const sampleSceneUvDepthY = getSceneUvAndDepth( viewPosition.sub( sampleViewOffset ) );
189
+ const sampleSceneViewPositionY = getViewPosition( sampleSceneUvDepthY.xy, sampleSceneUvDepthY.z );
190
+ const viewDeltaY = sampleSceneViewPositionY.sub( viewPosition );
191
+
192
+ If( abs( viewDeltaY.z ).lessThan( this.thickness ), () => {
193
+
194
+ const sampleCosHorizon = dot( viewDir, normalize( viewDeltaY ) );
195
+ cosHorizons.y.addAssign( max( 0, mul( sampleCosHorizon.sub( cosHorizons.y ), mix( 1.0, float( 2.0 ).div( float( j ).add( 2 ) ), this.distanceFallOff ) ) ) );
196
+
197
+ } );
198
+
199
+ } );
200
+
201
+ const sinHorizons = sqrt( sub( 1.0, cosHorizons.mul( cosHorizons ) ) );
202
+ const nx = dot( normalInSlice, sliceTangent );
203
+ const ny = dot( normalInSlice, viewDir );
204
+ const nxb = mul( 0.5, acos( cosHorizons.y ).sub( acos( cosHorizons.x ) ).add( sinHorizons.x.mul( cosHorizons.x ).sub( sinHorizons.y.mul( cosHorizons.y ) ) ) );
205
+ const nyb = mul( 0.5, sub( 2.0, cosHorizons.x.mul( cosHorizons.x ) ).sub( cosHorizons.y.mul( cosHorizons.y ) ) );
206
+ const occlusion = nx.mul( nxb ).add( ny.mul( nyb ) );
207
+ ao.addAssign( occlusion );
208
+
209
+ } );
210
+
211
+ ao.assign( clamp( ao.div( DIRECTIONS ), 0, 1 ) );
212
+ ao.assign( pow( ao, this.scale ) );
213
+
214
+ return vec4( vec3( ao ), 1.0 );
215
+
216
+ } );
217
+
218
+ const material = this._material || ( this._material = builder.createNodeMaterial() );
219
+ material.fragmentNode = ao().context( builder.getSharedContext() );
220
+ material.needsUpdate = true;
221
+
222
+ //
223
+
224
+ return this._textureNode;
225
+
226
+ }
227
+
228
+ dispose() {
229
+
230
+ this._aoRenderTarget.dispose();
231
+
232
+ }
233
+
234
+ }
235
+
236
+ function generateMagicSquareNoise( size = 5 ) {
237
+
238
+ const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
239
+ const magicSquare = generateMagicSquare( noiseSize );
240
+ const noiseSquareSize = magicSquare.length;
241
+ const data = new Uint8Array( noiseSquareSize * 4 );
242
+
243
+ for ( let inx = 0; inx < noiseSquareSize; ++ inx ) {
244
+
245
+ const iAng = magicSquare[ inx ];
246
+ const angle = ( 2 * Math.PI * iAng ) / noiseSquareSize;
247
+ const randomVec = new Vector3(
248
+ Math.cos( angle ),
249
+ Math.sin( angle ),
250
+ 0
251
+ ).normalize();
252
+ data[ inx * 4 ] = ( randomVec.x * 0.5 + 0.5 ) * 255;
253
+ data[ inx * 4 + 1 ] = ( randomVec.y * 0.5 + 0.5 ) * 255;
254
+ data[ inx * 4 + 2 ] = 127;
255
+ data[ inx * 4 + 3 ] = 255;
256
+
257
+ }
258
+
259
+ const noiseTexture = new DataTexture( data, noiseSize, noiseSize );
260
+ noiseTexture.wrapS = RepeatWrapping;
261
+ noiseTexture.wrapT = RepeatWrapping;
262
+ noiseTexture.needsUpdate = true;
263
+
264
+ return noiseTexture;
265
+
266
+ }
267
+
268
+ function generateMagicSquare( size ) {
269
+
270
+ const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
271
+ const noiseSquareSize = noiseSize * noiseSize;
272
+ const magicSquare = Array( noiseSquareSize ).fill( 0 );
273
+ let i = Math.floor( noiseSize / 2 );
274
+ let j = noiseSize - 1;
275
+
276
+ for ( let num = 1; num <= noiseSquareSize; ) {
277
+
278
+ if ( i === - 1 && j === noiseSize ) {
279
+
280
+ j = noiseSize - 2;
281
+ i = 0;
282
+
283
+ } else {
284
+
285
+ if ( j === noiseSize ) {
286
+
287
+ j = 0;
288
+
289
+ }
290
+
291
+ if ( i < 0 ) {
292
+
293
+ i = noiseSize - 1;
294
+
295
+ }
296
+
297
+ }
298
+
299
+ if ( magicSquare[ i * noiseSize + j ] !== 0 ) {
300
+
301
+ j -= 2;
302
+ i ++;
303
+ continue;
304
+
305
+ } else {
306
+
307
+ magicSquare[ i * noiseSize + j ] = num ++;
308
+
309
+ }
310
+
311
+ j ++;
312
+ i --;
313
+
314
+ }
315
+
316
+ return magicSquare;
317
+
318
+ }
319
+
320
+ export const ao = ( depthNode, normalNode, camera ) => nodeObject( new GTAONode( nodeObject( depthNode ), nodeObject( normalNode ), camera ) );
321
+
322
+ addNodeElement( 'ao', ao );
323
+
324
+ export default GTAONode;