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
@@ -47,10 +47,10 @@ class NodeFrame {
47
47
  const updateType = node.getUpdateBeforeType();
48
48
  const reference = node.updateReference( this );
49
49
 
50
- const { frameMap, renderMap } = this._getMaps( this.updateBeforeMap, reference );
51
-
52
50
  if ( updateType === NodeUpdateType.FRAME ) {
53
51
 
52
+ const { frameMap } = this._getMaps( this.updateBeforeMap, reference );
53
+
54
54
  if ( frameMap.get( node ) !== this.frameId ) {
55
55
 
56
56
  frameMap.set( node, this.frameId );
@@ -61,10 +61,11 @@ class NodeFrame {
61
61
 
62
62
  } else if ( updateType === NodeUpdateType.RENDER ) {
63
63
 
64
- if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
64
+ const { renderMap } = this._getMaps( this.updateBeforeMap, reference );
65
+
66
+ if ( renderMap.get( node ) !== this.renderId ) {
65
67
 
66
68
  renderMap.set( node, this.renderId );
67
- frameMap.set( node, this.frameId );
68
69
 
69
70
  node.updateBefore( this );
70
71
 
@@ -83,10 +84,10 @@ class NodeFrame {
83
84
  const updateType = node.getUpdateType();
84
85
  const reference = node.updateReference( this );
85
86
 
86
- const { frameMap, renderMap } = this._getMaps( this.updateMap, reference );
87
-
88
87
  if ( updateType === NodeUpdateType.FRAME ) {
89
88
 
89
+ const { frameMap } = this._getMaps( this.updateMap, reference );
90
+
90
91
  if ( frameMap.get( node ) !== this.frameId ) {
91
92
 
92
93
  frameMap.set( node, this.frameId );
@@ -97,10 +98,11 @@ class NodeFrame {
97
98
 
98
99
  } else if ( updateType === NodeUpdateType.RENDER ) {
99
100
 
100
- if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
101
+ const { renderMap } = this._getMaps( this.updateMap, reference );
102
+
103
+ if ( renderMap.get( node ) !== this.renderId ) {
101
104
 
102
105
  renderMap.set( node, this.renderId );
103
- frameMap.set( node, this.frameId );
104
106
 
105
107
  node.update( this );
106
108
 
@@ -23,6 +23,18 @@ class NodeUniform {
23
23
 
24
24
  }
25
25
 
26
+ get id() {
27
+
28
+ return this.node.id;
29
+
30
+ }
31
+
32
+ get groupNode() {
33
+
34
+ return this.node.groupNode;
35
+
36
+ }
37
+
26
38
  }
27
39
 
28
40
  export default NodeUniform;
@@ -6,17 +6,13 @@ export function getCacheKey( object ) {
6
6
 
7
7
  if ( object.isNode === true ) {
8
8
 
9
- cacheKey += `uuid:"${ object.uuid }"`;
9
+ cacheKey += object.id;
10
10
 
11
11
  }
12
12
 
13
- for ( const { property, index, childNode } of getNodeChildren( object ) ) {
13
+ for ( const { property, childNode } of getNodeChildren( object ) ) {
14
14
 
15
- // @TODO: Think about implement NodeArray and NodeObject.
16
-
17
- let childCacheKey = getCacheKey( childNode );
18
- if ( ! childCacheKey.includes( ',' ) ) childCacheKey = childCacheKey.slice( childCacheKey.indexOf( '"' ), childCacheKey.indexOf( '}' ) );
19
- cacheKey += `,${ property }${ index !== undefined ? '/' + index : '' }:${ childCacheKey }`;
15
+ cacheKey += ',' + property.slice( 0, - 4 ) + ':' + childNode.getCacheKey();
20
16
 
21
17
  }
22
18
 
@@ -137,9 +133,11 @@ export function getValueFromType( type, ...params ) {
137
133
 
138
134
  const last4 = type ? type.slice( - 4 ) : undefined;
139
135
 
140
- if ( ( last4 === 'vec2' || last4 === 'vec3' || last4 === 'vec4' ) && params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()
136
+ if ( params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()
141
137
 
142
- params = last4 === 'vec2' ? [ params[ 0 ], params[ 0 ] ] : [ params[ 0 ], params[ 0 ], params[ 0 ] ];
138
+ if ( last4 === 'vec2' ) params = [ params[ 0 ], params[ 0 ] ];
139
+ else if ( last4 === 'vec3' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ] ];
140
+ else if ( last4 === 'vec4' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ], params[ 0 ] ];
143
141
 
144
142
  }
145
143
 
@@ -20,7 +20,7 @@ class OutputStructNode extends Node {
20
20
  const members = this.members;
21
21
  const types = [];
22
22
 
23
- for ( let i = 0; i < members.length; i++ ) {
23
+ for ( let i = 0; i < members.length; i ++ ) {
24
24
 
25
25
  types.push( members[ i ].getNodeType( builder ) );
26
26
 
@@ -32,7 +32,7 @@ class OutputStructNode extends Node {
32
32
 
33
33
  generate( builder, output ) {
34
34
 
35
- const nodeVar = builder.getVarFromNode( this, this.nodeType );
35
+ const nodeVar = builder.getVarFromNode( this );
36
36
  nodeVar.isOutputStructVar = true;
37
37
 
38
38
  const propertyName = builder.getPropertyName( nodeVar );
@@ -41,11 +41,11 @@ class OutputStructNode extends Node {
41
41
 
42
42
  const structPrefix = propertyName !== '' ? propertyName + '.' : '';
43
43
 
44
- for ( let i = 0; i < members.length; i++ ) {
44
+ for ( let i = 0; i < members.length; i ++ ) {
45
45
 
46
46
  const snippet = members[ i ].build( builder, output );
47
47
 
48
- builder.addLineFlowCode( `${structPrefix}m${i} = ${snippet}` );
48
+ builder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }` );
49
49
 
50
50
  }
51
51
 
@@ -0,0 +1,33 @@
1
+ import { addNodeClass } from './Node.js';
2
+ import { nodeObject } from '../shadernode/ShaderNode.js';
3
+ import PropertyNode from './PropertyNode.js';
4
+
5
+ class ParameterNode extends PropertyNode {
6
+
7
+ constructor( nodeType, name = null ) {
8
+
9
+ super( nodeType, name );
10
+
11
+ this.isParameterNode = true;
12
+
13
+ }
14
+
15
+ getHash() {
16
+
17
+ return this.uuid;
18
+
19
+ }
20
+
21
+ generate() {
22
+
23
+ return this.name;
24
+
25
+ }
26
+
27
+ }
28
+
29
+ export default ParameterNode;
30
+
31
+ export const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) );
32
+
33
+ addNodeClass( 'ParameterNode', ParameterNode );
@@ -3,11 +3,14 @@ import { nodeImmutable, nodeObject } from '../shadernode/ShaderNode.js';
3
3
 
4
4
  class PropertyNode extends Node {
5
5
 
6
- constructor( nodeType, name = null ) {
6
+ constructor( nodeType, name = null, varying = false ) {
7
7
 
8
8
  super( nodeType );
9
9
 
10
10
  this.name = name;
11
+ this.varying = varying;
12
+
13
+ this.isPropertyNode = true;
11
14
 
12
15
  }
13
16
 
@@ -25,16 +28,20 @@ class PropertyNode extends Node {
25
28
 
26
29
  generate( builder ) {
27
30
 
28
- const nodeVary = builder.getVarFromNode( this, this.getNodeType( builder ) );
29
- const name = this.name;
31
+ let nodeVar;
32
+
33
+ if ( this.varying === true ) {
34
+
35
+ nodeVar = builder.getVaryingFromNode( this, this.name );
36
+ nodeVar.needsInterpolation = true;
30
37
 
31
- if ( name !== null ) {
38
+ } else {
32
39
 
33
- nodeVary.name = name;
40
+ nodeVar = builder.getVarFromNode( this, this.name );
34
41
 
35
42
  }
36
43
 
37
- return builder.getPropertyName( nodeVary );
44
+ return builder.getPropertyName( nodeVar );
38
45
 
39
46
  }
40
47
 
@@ -43,6 +50,7 @@ class PropertyNode extends Node {
43
50
  export default PropertyNode;
44
51
 
45
52
  export const property = ( type, name ) => nodeObject( new PropertyNode( type, name ) );
53
+ export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( type, name, true ) );
46
54
 
47
55
  export const diffuseColor = nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' );
48
56
  export const roughness = nodeImmutable( PropertyNode, 'float', 'Roughness' );
@@ -59,5 +67,6 @@ export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' );
59
67
  export const output = nodeImmutable( PropertyNode, 'vec4', 'Output' );
60
68
  export const dashSize = nodeImmutable( PropertyNode, 'float', 'dashSize' );
61
69
  export const gapSize = nodeImmutable( PropertyNode, 'float', 'gapSize' );
70
+ export const pointWidth = nodeImmutable( PropertyNode, 'float', 'pointWidth' );
62
71
 
63
72
  addNodeClass( 'PropertyNode', PropertyNode );
@@ -1,10 +1,6 @@
1
1
  import Node, { addNodeClass } from './Node.js';
2
- import { assign } from '../math/OperatorNode.js';
3
- import { bypass } from '../core/BypassNode.js';
4
- import { expression } from '../code/ExpressionNode.js';
5
2
  import { cond } from '../math/CondNode.js';
6
- import { loop } from '../utils/LoopNode.js';
7
- import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { ShaderNode, nodeProxy, getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
8
4
 
9
5
  class StackNode extends Node {
10
6
 
@@ -31,7 +27,7 @@ class StackNode extends Node {
31
27
 
32
28
  add( node ) {
33
29
 
34
- this.nodes.push( bypass( expression(), node ) );
30
+ this.nodes.push( node );
35
31
 
36
32
  return this;
37
33
 
@@ -66,19 +62,11 @@ class StackNode extends Node {
66
62
 
67
63
  }
68
64
 
69
- assign( targetNode, sourceValue ) {
70
-
71
- return this.add( assign( targetNode, sourceValue ) );
72
-
73
- }
74
-
75
- loop( ...params ) {
76
-
77
- return this.add( loop( ...params ) );
65
+ build( builder, ...params ) {
78
66
 
79
- }
67
+ const previousStack = getCurrentStack();
80
68
 
81
- build( builder, ...params ) {
69
+ setCurrentStack( this );
82
70
 
83
71
  for ( const node of this.nodes ) {
84
72
 
@@ -86,6 +74,8 @@ class StackNode extends Node {
86
74
 
87
75
  }
88
76
 
77
+ setCurrentStack( previousStack );
78
+
89
79
  return this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params );
90
80
 
91
81
  }
@@ -6,16 +6,16 @@ class StructTypeNode extends Node {
6
6
 
7
7
  super();
8
8
 
9
- this.types = types;
9
+ this.types = types;
10
10
  this.isStructTypeNode = true;
11
11
 
12
12
  }
13
13
 
14
- getMemberTypes() {
14
+ getMemberTypes() {
15
15
 
16
- return this.types;
16
+ return this.types;
17
17
 
18
- }
18
+ }
19
19
 
20
20
  }
21
21
 
@@ -33,7 +33,7 @@ class TempNode extends Node {
33
33
 
34
34
  const snippet = super.build( builder, type );
35
35
 
36
- const nodeVar = builder.getVarFromNode( this, type );
36
+ const nodeVar = builder.getVarFromNode( this, null, type );
37
37
  const propertyName = builder.getPropertyName( nodeVar );
38
38
 
39
39
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
@@ -0,0 +1,13 @@
1
+ class UniformGroup {
2
+
3
+ constructor( name ) {
4
+
5
+ this.name = name;
6
+
7
+ this.isUniformGroup = true;
8
+
9
+ }
10
+
11
+ }
12
+
13
+ export default UniformGroup;
@@ -0,0 +1,36 @@
1
+ import Node from './Node.js';
2
+ import { addNodeClass } from './Node.js';
3
+
4
+ class UniformGroupNode extends Node {
5
+
6
+ constructor( name, shared = false ) {
7
+
8
+ super( 'string' );
9
+
10
+ this.name = name;
11
+ this.version = 0;
12
+
13
+ this.shared = shared;
14
+
15
+ this.isUniformGroup = true;
16
+
17
+ }
18
+
19
+ set needsUpdate( value ) {
20
+
21
+ if ( value === true ) this.version ++;
22
+
23
+ }
24
+
25
+ }
26
+
27
+ export const uniformGroup = ( name ) => new UniformGroupNode( name );
28
+ export const sharedUniformGroup = ( name ) => new UniformGroupNode( name, true );
29
+
30
+ export const frameGroup = sharedUniformGroup( 'frame' );
31
+ export const renderGroup = sharedUniformGroup( 'render' );
32
+ export const objectGroup = uniformGroup( 'object' );
33
+
34
+ export default UniformGroupNode;
35
+
36
+ addNodeClass( 'UniformGroupNode', UniformGroupNode );
@@ -1,4 +1,5 @@
1
1
  import InputNode from './InputNode.js';
2
+ import { objectGroup } from './UniformGroupNode.js';
2
3
  import { addNodeClass } from './Node.js';
3
4
  import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js';
4
5
 
@@ -10,6 +11,22 @@ class UniformNode extends InputNode {
10
11
 
11
12
  this.isUniformNode = true;
12
13
 
14
+ this.groupNode = objectGroup;
15
+
16
+ }
17
+
18
+ setGroup( group ) {
19
+
20
+ this.groupNode = group;
21
+
22
+ return this;
23
+
24
+ }
25
+
26
+ getGroup() {
27
+
28
+ return this.groupNode;
29
+
13
30
  }
14
31
 
15
32
  getUniformHash( builder ) {
@@ -10,21 +10,7 @@ class VarNode extends Node {
10
10
  this.node = node;
11
11
  this.name = name;
12
12
 
13
- }
14
-
15
- assign( node ) {
16
-
17
- node.traverse( ( childNode, replaceNode ) => {
18
-
19
- if ( replaceNode && childNode.uuid === this.uuid ) {
20
-
21
- replaceNode( this.node );
22
-
23
- }
24
-
25
- } );
26
- this.node = node;
27
- return this;
13
+ this.isVarNode = true;
28
14
 
29
15
  }
30
16
 
@@ -48,28 +34,14 @@ class VarNode extends Node {
48
34
 
49
35
  generate( builder ) {
50
36
 
51
- const node = this.node;
52
- const name = this.name;
37
+ const { node, name } = this;
53
38
 
54
- if ( name === null && node.isTempNode === true ) {
55
-
56
- return node.build( builder );
57
-
58
- }
59
-
60
- const type = builder.getVectorType( this.getNodeType( builder ) );
61
-
62
- const snippet = node.build( builder, type );
63
- const nodeVar = builder.getVarFromNode( this, type );
64
-
65
- if ( name !== null ) {
66
-
67
- nodeVar.name = name;
68
-
69
- }
39
+ const nodeVar = builder.getVarFromNode( this, name, builder.getVectorType( this.getNodeType( builder ) ) );
70
40
 
71
41
  const propertyName = builder.getPropertyName( nodeVar );
72
42
 
43
+ const snippet = node.build( builder, nodeVar.type );
44
+
73
45
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
74
46
 
75
47
  return propertyName;
@@ -82,6 +54,7 @@ export default VarNode;
82
54
 
83
55
  export const temp = nodeProxy( VarNode );
84
56
 
85
- addNodeElement( 'temp', temp );
57
+ addNodeElement( 'temp', temp ); // @TODO: Will be removed in the future
58
+ addNodeElement( 'toVar', ( ...params ) => temp( ...params ).append() );
86
59
 
87
60
  addNodeClass( 'VarNode', VarNode );
@@ -11,6 +11,8 @@ class VaryingNode extends Node {
11
11
  this.node = node;
12
12
  this.name = name;
13
13
 
14
+ this.isVaryingNode = true;
15
+
14
16
  }
15
17
 
16
18
  isGlobal() {
@@ -38,17 +40,11 @@ class VaryingNode extends Node {
38
40
  const { name, node } = this;
39
41
  const type = this.getNodeType( builder );
40
42
 
41
- const nodeVarying = builder.getVaryingFromNode( this, type );
43
+ const nodeVarying = builder.getVaryingFromNode( this, name, type );
42
44
 
43
45
  // this property can be used to check if the varying can be optimized for a var
44
46
  nodeVarying.needsInterpolation || ( nodeVarying.needsInterpolation = ( builder.shaderStage === 'fragment' ) );
45
47
 
46
- if ( name !== null ) {
47
-
48
- nodeVarying.name = name;
49
-
50
- }
51
-
52
48
  const propertyName = builder.getPropertyName( nodeVarying, NodeShaderStage.VERTEX );
53
49
 
54
50
  // force node run in vertex stage
@@ -1,26 +1,45 @@
1
1
  import TempNode from '../core/TempNode.js';
2
- import { texture } from '../accessors/TextureNode.js';
3
2
  import { addNodeClass } from '../core/Node.js';
4
3
  import { uv } from '../accessors/UVNode.js';
5
4
  import { normalView } from '../accessors/NormalNode.js';
6
5
  import { positionView } from '../accessors/PositionNode.js';
7
6
  import { faceDirection } from './FrontFacingNode.js';
8
- import { tslFn, nodeProxy, vec2 } from '../shadernode/ShaderNode.js';
7
+ import { addNodeElement, tslFn, nodeProxy, float, vec2 } from '../shadernode/ShaderNode.js';
9
8
 
10
9
  // Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen
11
10
  // https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf
12
11
 
13
12
  // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
14
13
 
15
- const dHdxy_fwd = tslFn( ( { bumpTexture, bumpScale } ) => {
14
+ const dHdxy_fwd = tslFn( ( { textureNode, bumpScale } ) => {
16
15
 
17
- const uvNode = uv();
16
+ let texNode = textureNode;
18
17
 
19
- const Hll = texture( bumpTexture, uvNode ).x;
18
+ if ( texNode.isTextureNode !== true ) {
19
+
20
+ texNode.traverse( ( node ) => {
21
+
22
+ if ( node.isTextureNode === true ) texNode = node;
23
+
24
+ } );
25
+
26
+ }
27
+
28
+ if ( texNode.isTextureNode !== true ) {
29
+
30
+ throw new Error( 'THREE.TSL: dHdxy_fwd() requires a TextureNode.' );
31
+
32
+ }
33
+
34
+ const Hll = float( textureNode );
35
+ const uvNode = texNode.uvNode || uv();
36
+
37
+ // It's used to preserve the same TextureNode instance
38
+ const sampleTexture = ( uv ) => textureNode.cache().context( { getUV: () => uv, forceUVContext: true } );
20
39
 
21
40
  return vec2(
22
- texture( bumpTexture, uvNode.add( uvNode.dFdx() ) ).x.sub( Hll ),
23
- texture( bumpTexture, uvNode.add( uvNode.dFdy() ) ).x.sub( Hll )
41
+ float( sampleTexture( uvNode.add( uvNode.dFdx() ) ) ).sub( Hll ),
42
+ float( sampleTexture( uvNode.add( uvNode.dFdy() ) ) ).sub( Hll )
24
43
  ).mul( bumpScale );
25
44
 
26
45
  } );
@@ -29,8 +48,9 @@ const perturbNormalArb = tslFn( ( inputs ) => {
29
48
 
30
49
  const { surf_pos, surf_norm, dHdxy } = inputs;
31
50
 
32
- const vSigmaX = surf_pos.dFdx();
33
- const vSigmaY = surf_pos.dFdy();
51
+ // normalize is done to ensure that the bump map looks the same regardless of the texture's scale
52
+ const vSigmaX = surf_pos.dFdx().normalize();
53
+ const vSigmaY = surf_pos.dFdy().normalize();
34
54
  const vN = surf_norm; // normalized
35
55
 
36
56
  const R1 = vSigmaY.cross( vN );
@@ -46,11 +66,11 @@ const perturbNormalArb = tslFn( ( inputs ) => {
46
66
 
47
67
  class BumpMapNode extends TempNode {
48
68
 
49
- constructor( texture, scaleNode = null ) {
69
+ constructor( textureNode, scaleNode = null ) {
50
70
 
51
71
  super( 'vec3' );
52
72
 
53
- this.texture = texture;
73
+ this.textureNode = textureNode;
54
74
  this.scaleNode = scaleNode;
55
75
 
56
76
  }
@@ -58,10 +78,10 @@ class BumpMapNode extends TempNode {
58
78
  setup() {
59
79
 
60
80
  const bumpScale = this.scaleNode !== null ? this.scaleNode : 1;
61
- const dHdxy = dHdxy_fwd( { bumpTexture: this.texture, bumpScale } );
81
+ const dHdxy = dHdxy_fwd( { textureNode: this.textureNode, bumpScale } );
62
82
 
63
83
  return perturbNormalArb( {
64
- surf_pos: positionView.negate(),
84
+ surf_pos: positionView,
65
85
  surf_norm: normalView,
66
86
  dHdxy
67
87
  } );
@@ -74,4 +94,6 @@ export default BumpMapNode;
74
94
 
75
95
  export const bumpMap = nodeProxy( BumpMapNode );
76
96
 
97
+ addNodeElement( 'bumpMap', bumpMap );
98
+
77
99
  addNodeClass( 'BumpMapNode', BumpMapNode );
@@ -2,11 +2,11 @@ import TempNode from '../core/TempNode.js';
2
2
  import { dot, mix } from '../math/MathNode.js';
3
3
  import { add } from '../math/OperatorNode.js';
4
4
  import { addNodeClass } from '../core/Node.js';
5
- import { addNodeElement, tslFn, nodeProxy, float, vec3, mat3 } from '../shadernode/ShaderNode.js';
5
+ import { addNodeElement, tslFn, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js';
6
6
 
7
7
  const saturationNode = tslFn( ( { color, adjustment } ) => {
8
8
 
9
- return adjustment.mix( luminance( color ), color );
9
+ return adjustment.mix( luminance( color.rgb ), color.rgb );
10
10
 
11
11
  } );
12
12
 
@@ -17,21 +17,17 @@ const vibranceNode = tslFn( ( { color, adjustment } ) => {
17
17
  const mx = color.r.max( color.g.max( color.b ) );
18
18
  const amt = mx.sub( average ).mul( adjustment ).mul( - 3.0 );
19
19
 
20
- return mix( color, mx, amt );
20
+ return mix( color.rgb, mx, amt );
21
21
 
22
22
  } );
23
23
 
24
24
  const hueNode = tslFn( ( { color, adjustment } ) => {
25
25
 
26
- const RGBtoYIQ = mat3( 0.299, 0.587, 0.114, 0.595716, - 0.274453, - 0.321263, 0.211456, - 0.522591, 0.311135 );
27
- const YIQtoRGB = mat3( 1.0, 0.9563, 0.6210, 1.0, - 0.2721, - 0.6474, 1.0, - 1.107, 1.7046 );
26
+ const k = vec3( 0.57735, 0.57735, 0.57735 );
28
27
 
29
- const yiq = RGBtoYIQ.mul( color );
28
+ const cosAngle = adjustment.cos();
30
29
 
31
- const hue = yiq.z.atan2( yiq.y ).add( adjustment );
32
- const chroma = yiq.yz.length();
33
-
34
- return YIQtoRGB.mul( vec3( yiq.x, chroma.mul( hue.cos() ), chroma.mul( hue.sin() ) ) );
30
+ return vec3( color.rgb.mul( cosAngle ).add( k.cross( color.rgb ).mul( adjustment.sin() ).add( k.mul( dot( k, color.rgb ).mul( cosAngle.oneMinus() ) ) ) ) );
35
31
 
36
32
  } );
37
33