super-three 0.157.1 → 0.160.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 (303) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +3100 -1537
  3. package/build/three.js +3100 -1537
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +3093 -1538
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +291 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +62 -41
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +53 -48
  12. package/examples/jsm/exporters/GLTFExporter.js +151 -3
  13. package/examples/jsm/exporters/USDZExporter.js +27 -19
  14. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  15. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  16. package/examples/jsm/helpers/TextureHelper.js +237 -0
  17. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  18. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  19. package/examples/jsm/libs/opentype.module.js +13 -75
  20. package/examples/jsm/libs/surfaceNet.js +201 -0
  21. package/examples/jsm/lines/LineMaterial.js +16 -33
  22. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  23. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  24. package/examples/jsm/loaders/FBXLoader.js +294 -124
  25. package/examples/jsm/loaders/GLTFLoader.js +83 -6
  26. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  27. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  28. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  29. package/examples/jsm/loaders/SVGLoader.js +4 -4
  30. package/examples/jsm/loaders/USDZLoader.js +3 -17
  31. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  32. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  33. package/examples/jsm/math/Capsule.js +0 -55
  34. package/examples/jsm/math/Octree.js +85 -7
  35. package/examples/jsm/misc/Timer.js +119 -0
  36. package/examples/jsm/misc/TubePainter.js +3 -6
  37. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  38. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  39. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  40. package/examples/jsm/nodes/Nodes.js +16 -12
  41. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  42. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  43. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  44. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  45. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  46. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  47. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  48. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  49. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  50. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  52. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  54. package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
  55. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  56. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  57. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  58. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  59. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  60. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  61. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  62. package/examples/jsm/nodes/core/Node.js +13 -15
  63. package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
  64. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  65. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  66. package/examples/jsm/nodes/core/NodeUtils.js +7 -9
  67. package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
  68. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  69. package/examples/jsm/nodes/core/PropertyNode.js +15 -6
  70. package/examples/jsm/nodes/core/StackNode.js +7 -17
  71. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  72. package/examples/jsm/nodes/core/TempNode.js +1 -1
  73. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  74. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  75. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  76. package/examples/jsm/nodes/core/VarNode.js +7 -34
  77. package/examples/jsm/nodes/core/VaryingNode.js +3 -7
  78. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  79. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  80. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  81. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  82. package/examples/jsm/nodes/display/PassNode.js +182 -0
  83. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  84. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  85. package/examples/jsm/nodes/display/ViewportNode.js +17 -10
  86. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  87. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  88. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  89. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  90. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  91. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  92. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  93. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  94. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
  95. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
  97. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  98. package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
  99. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  100. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  101. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  102. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
  103. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  104. package/examples/jsm/nodes/materials/Materials.js +1 -0
  105. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  106. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
  107. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  108. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  109. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  110. package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
  111. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  112. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  113. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  114. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  115. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  116. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  117. package/examples/jsm/nodes/math/MathNode.js +2 -0
  118. package/examples/jsm/nodes/math/OperatorNode.js +24 -27
  119. package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
  120. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  121. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  122. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  123. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  124. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  125. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  126. package/examples/jsm/nodes/utils/SplitNode.js +10 -2
  127. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  128. package/examples/jsm/objects/InstancedPoints.js +21 -0
  129. package/examples/jsm/objects/Lensflare.js +20 -0
  130. package/examples/jsm/objects/QuadMesh.js +60 -0
  131. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  132. package/examples/jsm/objects/Refractor.js +3 -0
  133. package/examples/jsm/objects/Sky.js +5 -3
  134. package/examples/jsm/objects/Water.js +5 -2
  135. package/examples/jsm/objects/Water2.js +3 -0
  136. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  137. package/examples/jsm/physics/RapierPhysics.js +21 -0
  138. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  139. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  140. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  141. package/examples/jsm/postprocessing/OutputPass.js +3 -0
  142. package/examples/jsm/postprocessing/Pass.js +14 -3
  143. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  144. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  145. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  146. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  147. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  148. package/examples/jsm/renderers/common/Animation.js +10 -21
  149. package/examples/jsm/renderers/common/Backend.js +19 -3
  150. package/examples/jsm/renderers/common/Background.js +20 -22
  151. package/examples/jsm/renderers/common/Bindings.js +31 -22
  152. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  153. package/examples/jsm/renderers/common/Color4.js +37 -0
  154. package/examples/jsm/renderers/common/Geometries.js +4 -4
  155. package/examples/jsm/renderers/common/Info.js +12 -2
  156. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  157. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  158. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  159. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  160. package/examples/jsm/renderers/common/RenderObject.js +21 -2
  161. package/examples/jsm/renderers/common/RenderObjects.js +5 -3
  162. package/examples/jsm/renderers/common/Renderer.js +137 -37
  163. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  164. package/examples/jsm/renderers/common/Textures.js +8 -37
  165. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  166. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  167. package/examples/jsm/renderers/common/nodes/Nodes.js +121 -19
  168. package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
  169. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
  170. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -5
  171. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  172. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  173. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  174. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  175. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  176. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  177. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  178. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  179. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +188 -137
  180. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  181. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -90
  182. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  183. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  184. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  185. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  186. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  187. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  188. package/examples/jsm/shaders/BasicShader.js +2 -0
  189. package/examples/jsm/shaders/BlendShader.js +2 -0
  190. package/examples/jsm/shaders/BokehShader.js +2 -0
  191. package/examples/jsm/shaders/BokehShader2.js +4 -0
  192. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  193. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  194. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  195. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  196. package/examples/jsm/shaders/FXAAShader.js +135 -133
  197. package/examples/jsm/shaders/FilmShader.js +1 -1
  198. package/examples/jsm/shaders/FocusShader.js +2 -0
  199. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  200. package/examples/jsm/shaders/GTAOShader.js +424 -0
  201. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  202. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  203. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  204. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  205. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  206. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  207. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  208. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  209. package/examples/jsm/shaders/MirrorShader.js +2 -0
  210. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  211. package/examples/jsm/shaders/OutputShader.js +8 -5
  212. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  213. package/examples/jsm/shaders/SAOShader.js +7 -3
  214. package/examples/jsm/shaders/SMAAShader.js +6 -0
  215. package/examples/jsm/shaders/SSAOShader.js +8 -3
  216. package/examples/jsm/shaders/SSRShader.js +6 -0
  217. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  218. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  219. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  220. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  221. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  222. package/examples/jsm/shaders/VelocityShader.js +2 -0
  223. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  224. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  225. package/examples/jsm/transpiler/AST.js +270 -0
  226. package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
  227. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  228. package/examples/jsm/transpiler/TSLEncoder.js +715 -0
  229. package/examples/jsm/transpiler/Transpiler.js +18 -0
  230. package/examples/jsm/utils/SortUtils.js +158 -0
  231. package/examples/jsm/utils/TextureUtils.js +33 -21
  232. package/examples/jsm/webxr/ARButton.js +14 -0
  233. package/examples/jsm/webxr/VRButton.js +24 -9
  234. package/examples/jsm/webxr/XRButton.js +27 -11
  235. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  236. package/package.json +8 -6
  237. package/src/Three.js +1 -0
  238. package/src/constants.js +8 -1
  239. package/src/core/BufferAttribute.js +21 -2
  240. package/src/core/InterleavedBuffer.js +21 -1
  241. package/src/core/Object3D.js +60 -12
  242. package/src/core/UniformsGroup.js +7 -1
  243. package/src/extras/PMREMGenerator.js +7 -1
  244. package/src/extras/curves/LineCurve3.js +4 -0
  245. package/src/loaders/AudioLoader.js +1 -1
  246. package/src/loaders/BufferGeometryLoader.js +0 -7
  247. package/src/loaders/ImageBitmapLoader.js +25 -1
  248. package/src/loaders/MaterialLoader.js +10 -2
  249. package/src/loaders/ObjectLoader.js +49 -0
  250. package/src/materials/Material.js +27 -13
  251. package/src/materials/ShaderMaterial.js +2 -1
  252. package/src/math/Box3.js +35 -18
  253. package/src/math/ColorManagement.js +0 -16
  254. package/src/math/Quaternion.js +5 -4
  255. package/src/math/Sphere.js +2 -0
  256. package/src/math/Triangle.js +17 -5
  257. package/src/math/Vector3.js +11 -12
  258. package/src/objects/BatchedMesh.js +1020 -0
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +6 -7
  261. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  262. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  263. package/src/renderers/WebGLRenderer.js +165 -43
  264. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  265. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  266. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  267. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  268. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  269. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  270. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  271. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  272. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  273. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  274. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  275. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  276. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  277. package/src/renderers/shaders/ShaderChunk.js +4 -0
  278. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  279. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  280. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  281. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  282. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  283. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  286. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  287. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  288. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  289. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  290. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  291. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  292. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  293. package/src/renderers/webgl/WebGLLights.js +11 -2
  294. package/src/renderers/webgl/WebGLProgram.js +100 -51
  295. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  296. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  297. package/src/renderers/webgl/WebGLState.js +25 -4
  298. package/src/renderers/webgl/WebGLTextures.js +7 -11
  299. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  300. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  301. package/src/renderers/webxr/WebXRManager.js +16 -0
  302. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  303. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -1,10 +1,157 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { nodeProxy, tslFn } from '../shadernode/ShaderNode.js';
4
4
  import { uniform } from '../core/UniformNode.js';
5
- import { reference } from './ReferenceNode.js';
6
- import { bufferAttribute } from './BufferAttributeNode.js';
5
+ import { referenceIndex } from './ReferenceNode.js';
7
6
  import { positionLocal } from './PositionNode.js';
7
+ import { normalLocal } from './NormalNode.js';
8
+ import { textureLoad } from './TextureNode.js';
9
+ import { vertexIndex } from '../core/IndexNode.js';
10
+ import { ivec2, int } from '../shadernode/ShaderNode.js';
11
+ import { DataArrayTexture, Vector2, Vector4, FloatType } from 'three';
12
+
13
+ const morphTextures = new WeakMap();
14
+ const morphVec4 = new Vector4();
15
+
16
+ const getMorph = tslFn( ( { bufferMap, influence, stride, width, depth, offset } ) => {
17
+
18
+ const texelIndex = int( vertexIndex ).mul( stride ).add( offset );
19
+
20
+ const y = texelIndex.div( width );
21
+ const x = texelIndex.sub( y.mul( width ) );
22
+
23
+ const bufferAttrib = textureLoad( bufferMap, ivec2( x, y ) ).depth( depth );
24
+
25
+ return bufferAttrib.mul( influence );
26
+
27
+ } );
28
+
29
+ function getEntry( geometry ) {
30
+
31
+ const hasMorphPosition = geometry.morphAttributes.position !== undefined;
32
+ const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
33
+ const hasMorphColors = geometry.morphAttributes.color !== undefined;
34
+
35
+ // instead of using attributes, the WebGL 2 code path encodes morph targets
36
+ // into an array of data textures. Each layer represents a single morph target.
37
+
38
+ const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
39
+ const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
40
+
41
+ let entry = morphTextures.get( geometry );
42
+
43
+ if ( entry === undefined || entry.count !== morphTargetsCount ) {
44
+
45
+ if ( entry !== undefined ) entry.texture.dispose();
46
+
47
+ const morphTargets = geometry.morphAttributes.position || [];
48
+ const morphNormals = geometry.morphAttributes.normal || [];
49
+ const morphColors = geometry.morphAttributes.color || [];
50
+
51
+ let vertexDataCount = 0;
52
+
53
+ if ( hasMorphPosition === true ) vertexDataCount = 1;
54
+ if ( hasMorphNormals === true ) vertexDataCount = 2;
55
+ if ( hasMorphColors === true ) vertexDataCount = 3;
56
+
57
+ let width = geometry.attributes.position.count * vertexDataCount;
58
+ let height = 1;
59
+
60
+ const maxTextureSize = 4096; // @TODO: Use 'capabilities.maxTextureSize'
61
+
62
+ if ( width > maxTextureSize ) {
63
+
64
+ height = Math.ceil( width / maxTextureSize );
65
+ width = maxTextureSize;
66
+
67
+ }
68
+
69
+ const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
70
+
71
+ const bufferTexture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
72
+ bufferTexture.type = FloatType;
73
+ bufferTexture.needsUpdate = true;
74
+
75
+ // fill buffer
76
+
77
+ const vertexDataStride = vertexDataCount * 4;
78
+
79
+ for ( let i = 0; i < morphTargetsCount; i ++ ) {
80
+
81
+ const morphTarget = morphTargets[ i ];
82
+ const morphNormal = morphNormals[ i ];
83
+ const morphColor = morphColors[ i ];
84
+
85
+ const offset = width * height * 4 * i;
86
+
87
+ for ( let j = 0; j < morphTarget.count; j ++ ) {
88
+
89
+ const stride = j * vertexDataStride;
90
+
91
+ if ( hasMorphPosition === true ) {
92
+
93
+ morphVec4.fromBufferAttribute( morphTarget, j );
94
+
95
+ buffer[ offset + stride + 0 ] = morphVec4.x;
96
+ buffer[ offset + stride + 1 ] = morphVec4.y;
97
+ buffer[ offset + stride + 2 ] = morphVec4.z;
98
+ buffer[ offset + stride + 3 ] = 0;
99
+
100
+ }
101
+
102
+ if ( hasMorphNormals === true ) {
103
+
104
+ morphVec4.fromBufferAttribute( morphNormal, j );
105
+
106
+ buffer[ offset + stride + 4 ] = morphVec4.x;
107
+ buffer[ offset + stride + 5 ] = morphVec4.y;
108
+ buffer[ offset + stride + 6 ] = morphVec4.z;
109
+ buffer[ offset + stride + 7 ] = 0;
110
+
111
+ }
112
+
113
+ if ( hasMorphColors === true ) {
114
+
115
+ morphVec4.fromBufferAttribute( morphColor, j );
116
+
117
+ buffer[ offset + stride + 8 ] = morphVec4.x;
118
+ buffer[ offset + stride + 9 ] = morphVec4.y;
119
+ buffer[ offset + stride + 10 ] = morphVec4.z;
120
+ buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morphVec4.w : 1;
121
+
122
+ }
123
+
124
+ }
125
+
126
+ }
127
+
128
+ entry = {
129
+ count: morphTargetsCount,
130
+ texture: bufferTexture,
131
+ stride: vertexDataCount,
132
+ size: new Vector2( width, height )
133
+ };
134
+
135
+ morphTextures.set( geometry, entry );
136
+
137
+ function disposeTexture() {
138
+
139
+ bufferTexture.dispose();
140
+
141
+ morphTextures.delete( geometry );
142
+
143
+ geometry.removeEventListener( 'dispose', disposeTexture );
144
+
145
+ }
146
+
147
+ geometry.addEventListener( 'dispose', disposeTexture );
148
+
149
+ }
150
+
151
+ return entry;
152
+
153
+ }
154
+
8
155
 
9
156
  class MorphNode extends Node {
10
157
 
@@ -19,29 +166,57 @@ class MorphNode extends Node {
19
166
 
20
167
  }
21
168
 
22
- setupAttribute( builder, name, assignNode = positionLocal ) {
169
+ setup( builder ) {
23
170
 
24
- const mesh = this.mesh;
25
- const attributes = mesh.geometry.morphAttributes[ name ];
171
+ const { geometry } = builder;
26
172
 
27
- builder.stack.assign( assignNode, assignNode.mul( this.morphBaseInfluence ) );
173
+ const hasMorphPosition = geometry.morphAttributes.position !== undefined;
174
+ const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
28
175
 
29
- for ( let i = 0; i < attributes.length; i ++ ) {
176
+ const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
177
+ const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
30
178
 
31
- const attribute = attributes[ i ];
179
+ // nodes
32
180
 
33
- const bufferAttrib = bufferAttribute( attribute.array, 'vec3' );
34
- const influence = reference( i, 'float', mesh.morphTargetInfluences );
181
+ const { texture: bufferMap, stride, size } = getEntry( geometry );
35
182
 
36
- builder.stack.assign( assignNode, assignNode.add( bufferAttrib.mul( influence ) ) );
183
+ if ( hasMorphPosition === true ) positionLocal.mulAssign( this.morphBaseInfluence );
184
+ if ( hasMorphNormals === true ) normalLocal.mulAssign( this.morphBaseInfluence );
37
185
 
38
- }
186
+ const width = int( size.width );
39
187
 
40
- }
188
+ for ( let i = 0; i < morphTargetsCount; i ++ ) {
41
189
 
42
- setup( builder ) {
190
+ const influence = referenceIndex( 'morphTargetInfluences', i, 'float' );
191
+ const depth = int( i );
192
+
193
+ if ( hasMorphPosition === true ) {
194
+
195
+ positionLocal.addAssign( getMorph( {
196
+ bufferMap,
197
+ influence,
198
+ stride,
199
+ width,
200
+ depth,
201
+ offset: int( 0 )
202
+ } ) );
203
+
204
+ }
43
205
 
44
- this.setupAttribute( builder, 'position' );
206
+ if ( hasMorphNormals === true ) {
207
+
208
+ normalLocal.addAssign( getMorph( {
209
+ bufferMap,
210
+ influence,
211
+ stride,
212
+ width,
213
+ depth,
214
+ offset: int( 1 )
215
+ } ) );
216
+
217
+ }
218
+
219
+ }
45
220
 
46
221
  }
47
222
 
@@ -86,7 +86,7 @@ NormalNode.WORLD = 'world';
86
86
  export default NormalNode;
87
87
 
88
88
  export const normalGeometry = nodeImmutable( NormalNode, NormalNode.GEOMETRY );
89
- export const normalLocal = nodeImmutable( NormalNode, NormalNode.LOCAL );
89
+ export const normalLocal = nodeImmutable( NormalNode, NormalNode.LOCAL ).temp( 'Normal' );
90
90
  export const normalView = nodeImmutable( NormalNode, NormalNode.VIEW );
91
91
  export const normalWorld = nodeImmutable( NormalNode, NormalNode.WORLD );
92
92
  export const transformedNormalView = property( 'vec3', 'TransformedNormalView' );
@@ -95,7 +95,7 @@ PositionNode.VIEW_DIRECTION = 'viewDirection';
95
95
  export default PositionNode;
96
96
 
97
97
  export const positionGeometry = nodeImmutable( PositionNode, PositionNode.GEOMETRY );
98
- export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL );
98
+ export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL ).temp( 'Position' );
99
99
  export const positionWorld = nodeImmutable( PositionNode, PositionNode.WORLD );
100
100
  export const positionWorldDirection = nodeImmutable( PositionNode, PositionNode.WORLD_DIRECTION );
101
101
  export const positionView = nodeImmutable( PositionNode, PositionNode.VIEW );
@@ -11,6 +11,7 @@ class ReferenceNode extends Node {
11
11
  super();
12
12
 
13
13
  this.property = property;
14
+ this.index = null;
14
15
 
15
16
  this.uniformType = uniformType;
16
17
 
@@ -33,6 +34,20 @@ class ReferenceNode extends Node {
33
34
 
34
35
  }
35
36
 
37
+ setIndex( index ) {
38
+
39
+ this.index = index;
40
+
41
+ return this;
42
+
43
+ }
44
+
45
+ getIndex() {
46
+
47
+ return this.index;
48
+
49
+ }
50
+
36
51
  setNodeType( uniformType ) {
37
52
 
38
53
  let node = null;
@@ -59,7 +74,15 @@ class ReferenceNode extends Node {
59
74
 
60
75
  update( /*frame*/ ) {
61
76
 
62
- this.node.value = this.reference[ this.property ];
77
+ let value = this.reference[ this.property ];
78
+
79
+ if ( this.index !== null ) {
80
+
81
+ value = value[ this.index ];
82
+
83
+ }
84
+
85
+ this.node.value = value;
63
86
 
64
87
  }
65
88
 
@@ -74,5 +97,6 @@ class ReferenceNode extends Node {
74
97
  export default ReferenceNode;
75
98
 
76
99
  export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
100
+ export const referenceIndex = ( name, index, type, object ) => nodeObject( new ReferenceNode( name, type, object ).setIndex( index ) );
77
101
 
78
102
  addNodeClass( 'ReferenceNode', ReferenceNode );
@@ -67,12 +67,22 @@ class SkinningNode extends Node {
67
67
 
68
68
  // ASSIGNS
69
69
 
70
- builder.stack.assign( positionLocal, skinPosition );
71
- builder.stack.assign( normalLocal, skinNormal );
70
+ positionLocal.assign( skinPosition );
71
+ normalLocal.assign( skinNormal );
72
72
 
73
73
  if ( builder.hasGeometryAttribute( 'tangent' ) ) {
74
74
 
75
- builder.stack.assign( tangentLocal, skinNormal );
75
+ tangentLocal.assign( skinNormal );
76
+
77
+ }
78
+
79
+ }
80
+
81
+ generate( builder, output ) {
82
+
83
+ if ( output !== 'void' ) {
84
+
85
+ return positionLocal.build( builder, output );
76
86
 
77
87
  }
78
88
 
@@ -2,15 +2,15 @@ import UniformNode, { uniform } from '../core/UniformNode.js';
2
2
  import { uv } from './UVNode.js';
3
3
  import { textureSize } from './TextureSizeNode.js';
4
4
  import { colorSpaceToLinear } from '../display/ColorSpaceNode.js';
5
- import { context } from '../core/ContextNode.js';
6
5
  import { expression } from '../code/ExpressionNode.js';
7
6
  import { addNodeClass } from '../core/Node.js';
7
+ import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
8
8
  import { addNodeElement, nodeProxy, vec3, nodeObject } from '../shadernode/ShaderNode.js';
9
9
  import { NodeUpdateType } from '../core/constants.js';
10
10
 
11
11
  class TextureNode extends UniformNode {
12
12
 
13
- constructor( value, uvNode = null, levelNode = null, compareNode = null ) {
13
+ constructor( value, uvNode = null, levelNode = null ) {
14
14
 
15
15
  super( value );
16
16
 
@@ -18,8 +18,10 @@ class TextureNode extends UniformNode {
18
18
 
19
19
  this.uvNode = uvNode;
20
20
  this.levelNode = levelNode;
21
- this.compareNode = compareNode;
21
+ this.compareNode = null;
22
+ this.depthNode = null;
22
23
 
24
+ this.sampler = true;
23
25
  this.updateMatrix = false;
24
26
  this.updateType = NodeUpdateType.NONE;
25
27
 
@@ -76,6 +78,20 @@ class TextureNode extends UniformNode {
76
78
 
77
79
  }
78
80
 
81
+ setupUV( builder, uvNode ) {
82
+
83
+ const texture = this.value;
84
+
85
+ if ( builder.isFlipY() && ( texture.isRenderTargetTexture === true || texture.isFramebufferTexture === true || texture.isDepthTexture === true ) ) {
86
+
87
+ uvNode = uvNode.setY( uvNode.y.oneMinus() );
88
+
89
+ }
90
+
91
+ return uvNode;
92
+
93
+ }
94
+
79
95
  setup( builder ) {
80
96
 
81
97
  const properties = builder.getNodeProperties( this );
@@ -84,9 +100,9 @@ class TextureNode extends UniformNode {
84
100
 
85
101
  let uvNode = this.uvNode;
86
102
 
87
- if ( uvNode === null && builder.context.getUVNode ) {
103
+ if ( ( uvNode === null || builder.context.forceUVContext === true ) && builder.context.getUV ) {
88
104
 
89
- uvNode = builder.context.getUVNode( this );
105
+ uvNode = builder.context.getUV( this );
90
106
 
91
107
  }
92
108
 
@@ -98,28 +114,71 @@ class TextureNode extends UniformNode {
98
114
 
99
115
  }
100
116
 
117
+ uvNode = this.setupUV( builder, uvNode );
118
+
101
119
  //
102
120
 
103
121
  let levelNode = this.levelNode;
104
122
 
105
- if ( levelNode === null && builder.context.getSamplerLevelNode ) {
123
+ if ( levelNode === null && builder.context.getTextureLevel ) {
124
+
125
+ levelNode = builder.context.getTextureLevel( this );
126
+
127
+ }
128
+
129
+ if ( levelNode !== null && builder.context.getTextureLevelAlgorithm !== undefined ) {
106
130
 
107
- levelNode = builder.context.getSamplerLevelNode( this );
131
+ levelNode = builder.context.getTextureLevelAlgorithm( this, levelNode );
108
132
 
109
133
  }
110
134
 
111
135
  //
112
136
 
113
137
  properties.uvNode = uvNode;
114
- properties.levelNode = levelNode ? builder.context.getMIPLevelAlgorithmNode( this, levelNode ) : null;
138
+ properties.levelNode = levelNode;
139
+ properties.compareNode = this.compareNode;
140
+ properties.depthNode = this.depthNode;
141
+
142
+ }
143
+
144
+ generateUV( builder, uvNode ) {
145
+
146
+ return uvNode.build( builder, this.sampler === true ? 'vec2' : 'ivec2' );
147
+
148
+ }
149
+
150
+ generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet ) {
151
+
152
+ const texture = this.value;
153
+
154
+ let snippet;
155
+
156
+ if ( levelSnippet ) {
157
+
158
+ snippet = builder.generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet );
159
+
160
+ } else if ( compareSnippet ) {
161
+
162
+ snippet = builder.generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet );
163
+
164
+ } else if ( this.sampler === false ) {
165
+
166
+ snippet = builder.generateTextureLoad( texture, textureProperty, uvSnippet, depthSnippet );
167
+
168
+ } else {
169
+
170
+ snippet = builder.generateTexture( texture, textureProperty, uvSnippet, depthSnippet );
171
+
172
+ }
173
+
174
+ return snippet;
115
175
 
116
176
  }
117
177
 
118
178
  generate( builder, output ) {
119
179
 
120
- const { uvNode, levelNode } = builder.getNodeProperties( this );
180
+ const properties = builder.getNodeProperties( this );
121
181
 
122
- const compareNode = this.compareNode;
123
182
  const texture = this.value;
124
183
 
125
184
  if ( ! texture || texture.isTexture !== true ) {
@@ -140,37 +199,24 @@ class TextureNode extends UniformNode {
140
199
 
141
200
  } else {
142
201
 
143
- const nodeType = this.getNodeType( builder );
144
202
  const nodeData = builder.getDataFromNode( this );
145
203
 
146
204
  let propertyName = nodeData.propertyName;
147
205
 
148
206
  if ( propertyName === undefined ) {
149
207
 
150
- const uvSnippet = uvNode.build( builder, 'vec2' );
151
- const nodeVar = builder.getVarFromNode( this, nodeType );
208
+ const { uvNode, levelNode, compareNode, depthNode } = properties;
152
209
 
153
- propertyName = builder.getPropertyName( nodeVar );
154
-
155
- let snippet = null;
156
-
157
- if ( levelNode && levelNode.isNode === true ) {
158
-
159
- const levelSnippet = levelNode.build( builder, 'float' );
160
-
161
- snippet = builder.getTextureLevel( texture, textureProperty, uvSnippet, levelSnippet );
210
+ const uvSnippet = this.generateUV( builder, uvNode );
211
+ const levelSnippet = levelNode ? levelNode.build( builder, 'float' ) : null;
212
+ const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;
213
+ const compareSnippet = compareNode ? compareNode.build( builder, 'float' ) : null;
162
214
 
163
- } else if ( compareNode !== null ) {
215
+ const nodeVar = builder.getVarFromNode( this );
164
216
 
165
- const compareSnippet = compareNode.build( builder, 'float' );
166
-
167
- snippet = builder.getTextureCompare( texture, textureProperty, uvSnippet, compareSnippet );
168
-
169
- } else {
170
-
171
- snippet = builder.getTexture( texture, textureProperty, uvSnippet );
217
+ propertyName = builder.getPropertyName( nodeVar );
172
218
 
173
- }
219
+ const snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet );
174
220
 
175
221
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
176
222
 
@@ -184,10 +230,11 @@ class TextureNode extends UniformNode {
184
230
  }
185
231
 
186
232
  let snippet = propertyName;
233
+ const nodeType = this.getNodeType( builder );
187
234
 
188
- if ( builder.needsColorSpaceToLinear( this.value ) ) {
235
+ if ( builder.needsColorSpaceToLinear( texture ) ) {
189
236
 
190
- snippet = colorSpaceToLinear( expression( snippet, nodeType ), this.value.colorSpace ).setup( builder ).build( builder, nodeType );
237
+ snippet = colorSpaceToLinear( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );
191
238
 
192
239
  }
193
240
 
@@ -197,6 +244,22 @@ class TextureNode extends UniformNode {
197
244
 
198
245
  }
199
246
 
247
+ setSampler( value ) {
248
+
249
+ this.sampler = value;
250
+
251
+ return this;
252
+
253
+ }
254
+
255
+ getSampler() {
256
+
257
+ return this.sampler;
258
+
259
+ }
260
+
261
+ // @TODO: Move to TSL
262
+
200
263
  uv( uvNode ) {
201
264
 
202
265
  const textureNode = this.clone();
@@ -206,14 +269,21 @@ class TextureNode extends UniformNode {
206
269
 
207
270
  }
208
271
 
272
+ blur( levelNode ) {
273
+
274
+ const textureNode = this.clone();
275
+ textureNode.levelNode = levelNode.mul( maxMipLevel( textureNode ) );
276
+
277
+ return nodeObject( textureNode );
278
+
279
+ }
280
+
209
281
  level( levelNode ) {
210
282
 
211
283
  const textureNode = this.clone();
212
284
  textureNode.levelNode = levelNode;
213
285
 
214
- return context( textureNode, {
215
- getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => levelNode
216
- } );
286
+ return textureNode;
217
287
 
218
288
  }
219
289
 
@@ -232,6 +302,17 @@ class TextureNode extends UniformNode {
232
302
 
233
303
  }
234
304
 
305
+ depth( depthNode ) {
306
+
307
+ const textureNode = this.clone();
308
+ textureNode.depthNode = nodeObject( depthNode );
309
+
310
+ return nodeObject( textureNode );
311
+
312
+ }
313
+
314
+ // --
315
+
235
316
  serialize( data ) {
236
317
 
237
318
  super.serialize( data );
@@ -262,7 +343,10 @@ class TextureNode extends UniformNode {
262
343
 
263
344
  clone() {
264
345
 
265
- return new this.constructor( this.value, this.uvNode, this.levelNode, this.compareNode );
346
+ const newNode = new this.constructor( this.value, this.uvNode, this.levelNode );
347
+ newNode.sampler = this.sampler;
348
+
349
+ return newNode;
266
350
 
267
351
  }
268
352
 
@@ -271,6 +355,8 @@ class TextureNode extends UniformNode {
271
355
  export default TextureNode;
272
356
 
273
357
  export const texture = nodeProxy( TextureNode );
358
+ export const textureLoad = ( ...params ) => texture( ...params ).setSampler( false );
359
+
274
360
  //export const textureLevel = ( value, uv, level ) => texture( value, uv ).level( level );
275
361
 
276
362
  export const sampler = ( aTexture ) => ( aTexture.isNode === true ? aTexture : texture( aTexture ) ).convert( 'sampler' );
@@ -12,13 +12,13 @@ class CodeNode extends Node {
12
12
  this.code = code;
13
13
  this.language = language;
14
14
 
15
- this._includes = includes;
15
+ this.includes = includes;
16
16
 
17
17
  }
18
18
 
19
19
  setIncludes( includes ) {
20
20
 
21
- this._includes = includes;
21
+ this.includes = includes;
22
22
 
23
23
  return this;
24
24
 
@@ -26,7 +26,7 @@ class CodeNode extends Node {
26
26
 
27
27
  getIncludes( /*builder*/ ) {
28
28
 
29
- return this._includes;
29
+ return this.includes;
30
30
 
31
31
  }
32
32
 
@@ -81,7 +81,7 @@ class FunctionNode extends CodeNode {
81
81
 
82
82
  }
83
83
 
84
- nodeCode.code = code;
84
+ nodeCode.code = code + '\n';
85
85
 
86
86
  if ( output === 'property' ) {
87
87