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,16 +1,15 @@
1
1
  import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
2
2
  import { temp } from '../core/VarNode.js';
3
3
  import { varying } from '../core/VaryingNode.js';
4
- import { property } from '../core/PropertyNode.js';
4
+ import { property, varyingProperty } from '../core/PropertyNode.js';
5
5
  import { attribute } from '../core/AttributeNode.js';
6
6
  import { cameraProjectionMatrix } from '../accessors/CameraNode.js';
7
- import { materialColor } from '../accessors/MaterialNode.js';
7
+ import { materialColor, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineDashOffset, materialLineWidth } from '../accessors/MaterialNode.js';
8
8
  import { modelViewMatrix } from '../accessors/ModelNode.js';
9
9
  import { positionGeometry } from '../accessors/PositionNode.js';
10
- import { abs, mix, mod, dot, clamp, smoothstep } from '../math/MathNode.js';
11
- import { tslFn, ShaderNode, float, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
10
+ import { mix, smoothstep } from '../math/MathNode.js';
11
+ import { tslFn, float, vec2, vec3, vec4, If } from '../shadernode/ShaderNode.js';
12
12
  import { uv } from '../accessors/UVNode.js';
13
- import { materialLineScale, materialLineDashSize, materialLineGapSize, materialLineDashOffset, materialLineWidth } from '../accessors/LineMaterialNode.js';
14
13
  import { viewport } from '../display/ViewportNode.js';
15
14
  import { dashSize, gapSize } from '../core/PropertyNode.js';
16
15
 
@@ -61,7 +60,7 @@ class Line2NodeMaterial extends NodeMaterial {
61
60
 
62
61
  const a = cameraProjectionMatrix.element( 2 ).element( 2 ); // 3nd entry in 3th column
63
62
  const b = cameraProjectionMatrix.element( 3 ).element( 2 ); // 3nd entry in 4th column
64
- const nearEstimate = b.mul( -0.5 ).div( a );
63
+ const nearEstimate = b.mul( - 0.5 ).div( a );
65
64
 
66
65
  const alpha = nearEstimate.sub( start.z ).div( end.z.sub( start.z ) );
67
66
 
@@ -69,9 +68,9 @@ class Line2NodeMaterial extends NodeMaterial {
69
68
 
70
69
  } );
71
70
 
72
- this.vertexNode = new ShaderNode( ( stack ) => {
71
+ this.vertexNode = tslFn( () => {
73
72
 
74
- stack.assign( varying( vec2(), 'vUv' ), uv() );
73
+ varyingProperty( 'vec2', 'vUv' ).assign( uv() );
75
74
 
76
75
  const instanceStart = attribute( 'instanceStart' );
77
76
  const instanceEnd = attribute( 'instanceEnd' );
@@ -81,14 +80,13 @@ class Line2NodeMaterial extends NodeMaterial {
81
80
  const start = property( 'vec4', 'start' );
82
81
  const end = property( 'vec4', 'end' );
83
82
 
84
- stack.assign( start, modelViewMatrix.mul( vec4( instanceStart, 1.0 ) ) ); // force assignment into correct place in flow
85
- stack.assign( end, modelViewMatrix.mul( vec4( instanceEnd, 1.0 ) ) );
86
-
83
+ start.assign( modelViewMatrix.mul( vec4( instanceStart, 1.0 ) ) ); // force assignment into correct place in flow
84
+ end.assign( modelViewMatrix.mul( vec4( instanceEnd, 1.0 ) ) );
87
85
 
88
86
  if ( useWorldUnits ) {
89
87
 
90
- stack.assign( varying( vec3(), 'worldStart' ), start.xyz );
91
- stack.assign( varying( vec3(), 'worldEnd' ), end.xyz );
88
+ varyingProperty( 'vec3', 'worldStart' ).assign( start.xyz );
89
+ varyingProperty( 'vec3', 'worldEnd' ).assign( end.xyz );
92
90
 
93
91
  }
94
92
 
@@ -99,17 +97,17 @@ class Line2NodeMaterial extends NodeMaterial {
99
97
  // but we need to perform ndc-space calculations in the shader, so we must address this issue directly
100
98
  // perhaps there is a more elegant solution -- WestLangley
101
99
 
102
- const perspective = cameraProjectionMatrix.element( 2 ).element( 3 ).equal( -1.0 ); // 4th entry in the 3rd column
100
+ const perspective = cameraProjectionMatrix.element( 2 ).element( 3 ).equal( - 1.0 ); // 4th entry in the 3rd column
103
101
 
104
- stack.if( perspective, ( stack ) => {
102
+ If( perspective, () => {
105
103
 
106
- stack.if( start.z.lessThan( 0.0 ).and( end.z.greaterThan( 0.0 ) ), ( stack ) => {
104
+ If( start.z.lessThan( 0.0 ).and( end.z.greaterThan( 0.0 ) ), () => {
107
105
 
108
- stack.assign( end, trimSegment( { start: start, end: end } ) );
106
+ end.assign( trimSegment( { start: start, end: end } ) );
109
107
 
110
- } ).elseif( end.z.lessThan( 0.0 ).and( start.z.greaterThanEqual( 0.0 ) ), ( stack ) => {
108
+ } ).elseif( end.z.lessThan( 0.0 ).and( start.z.greaterThanEqual( 0.0 ) ), () => {
111
109
 
112
- stack.assign( start, trimSegment( { start: end, end: start } ) );
110
+ start.assign( trimSegment( { start: end, end: start } ) );
113
111
 
114
112
  } );
115
113
 
@@ -124,11 +122,11 @@ class Line2NodeMaterial extends NodeMaterial {
124
122
  const ndcEnd = clipEnd.xyz.div( clipEnd.w );
125
123
 
126
124
  // direction
127
- const dir = ndcEnd.xy.sub( ndcStart.xy );
125
+ const dir = ndcEnd.xy.sub( ndcStart.xy ).temp();
128
126
 
129
127
  // account for clip-space aspect ratio
130
- stack.assign( dir.x, dir.x.mul( aspect ) );
131
- stack.assign( dir, dir.normalize() );
128
+ dir.x.assign( dir.x.mul( aspect ) );
129
+ dir.assign( dir.normalize() );
132
130
 
133
131
  const clip = temp( vec4() );
134
132
 
@@ -144,7 +142,7 @@ class Line2NodeMaterial extends NodeMaterial {
144
142
  );
145
143
 
146
144
  // sign flip
147
- stack.assign( offset, positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
145
+ offset.assign( positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
148
146
 
149
147
  const forwardOffset = worldDir.dot( vec3( 0.0, 0.0, 1.0 ) );
150
148
 
@@ -153,86 +151,86 @@ class Line2NodeMaterial extends NodeMaterial {
153
151
  if ( ! useDash ) {
154
152
 
155
153
  // extend the line bounds to encompass endcaps
156
- stack.assign( start, start.sub( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
157
- stack.assign( end, end.add( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
154
+ start.assign( start.sub( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
155
+ end.assign( end.add( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
158
156
 
159
157
  // shift the position of the quad so it hugs the forward edge of the line
160
- stack.assign( offset, offset.sub( vec3( dir.mul( forwardOffset ), 0 ) ) );
161
- stack.assign( offset.z, offset.z.add( 0.5 ) );
158
+ offset.assign( offset.sub( vec3( dir.mul( forwardOffset ), 0 ) ) );
159
+ offset.z.assign( offset.z.add( 0.5 ) );
162
160
 
163
161
  }
164
162
 
165
163
  // endcaps
166
164
 
167
- stack.if( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), ( stack ) => {
165
+ If( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), () => {
168
166
 
169
- stack.assign( offset, offset.add( vec3( dir.mul( 2.0 ).mul( forwardOffset ), 0 ) ) );
167
+ offset.assign( offset.add( vec3( dir.mul( 2.0 ).mul( forwardOffset ), 0 ) ) );
170
168
 
171
169
  } );
172
170
 
173
171
  // adjust for linewidth
174
- stack.assign( offset, offset.mul( materialLineWidth ).mul( 0.5 ) );
172
+ offset.assign( offset.mul( materialLineWidth ).mul( 0.5 ) );
175
173
 
176
174
  // set the world position
177
175
 
178
- const worldPos = varying( vec4(), 'worldPos' );
176
+ const worldPos = varyingProperty( 'vec4', 'worldPos' );
179
177
 
180
- stack.assign( worldPos, positionGeometry.y.lessThan( 0.5 ).cond( start, end ) );
181
- stack.assign( worldPos, worldPos.add( vec4( offset, 0 ) ) );
178
+ worldPos.assign( positionGeometry.y.lessThan( 0.5 ).cond( start, end ) );
179
+ worldPos.assign( worldPos.add( vec4( offset, 0 ) ) );
182
180
 
183
181
  // project the worldpos
184
- stack.assign( clip, cameraProjectionMatrix.mul( worldPos ) );
182
+ clip.assign( cameraProjectionMatrix.mul( worldPos ) );
185
183
 
186
184
  // shift the depth of the projected points so the line
187
185
  // segments overlap neatly
188
186
  const clipPose = temp( vec3() );
189
187
 
190
- stack.assign( clipPose, positionGeometry.y.lessThan( 0.5 ).cond( ndcStart, ndcEnd ) );
191
- stack.assign( clip.z, clipPose.z.mul( clip.w ) );
188
+ clipPose.assign( positionGeometry.y.lessThan( 0.5 ).cond( ndcStart, ndcEnd ) );
189
+ clip.z.assign( clipPose.z.mul( clip.w ) );
192
190
 
193
191
  } else {
194
192
 
195
193
  const offset = property( 'vec2', 'offset' );
196
194
 
197
- stack.assign( offset, vec2( dir.y, dir.x.negate() ) );
195
+ offset.assign( vec2( dir.y, dir.x.negate() ) );
198
196
 
199
197
  // undo aspect ratio adjustment
200
- stack.assign( dir.x, dir.x.div( aspect ) );
201
- stack.assign( offset.x, offset.x.div( aspect ) );
198
+ dir.x.assign( dir.x.div( aspect ) );
199
+ offset.x.assign( offset.x.div( aspect ) );
202
200
 
203
201
  // sign flip
204
- stack.assign( offset, positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
202
+ offset.assign( positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
205
203
 
206
204
  // endcaps
207
- stack.if( positionGeometry.y.lessThan( 0.0 ), ( stack ) => {
205
+ If( positionGeometry.y.lessThan( 0.0 ), () => {
208
206
 
209
- stack.assign( offset, offset.sub( dir ) );
207
+ offset.assign( offset.sub( dir ) );
210
208
 
211
- } ).elseif( positionGeometry.y.greaterThan( 1.0 ), ( stack ) => {
209
+ } ).elseif( positionGeometry.y.greaterThan( 1.0 ), () => {
212
210
 
213
- stack.assign( offset, offset.add( dir ) );
211
+ offset.assign( offset.add( dir ) );
214
212
 
215
213
  } );
216
214
 
217
215
  // adjust for linewidth
218
- stack.assign( offset, offset.mul( materialLineWidth ) );
216
+ offset.assign( offset.mul( materialLineWidth ) );
219
217
 
220
218
  // adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...
221
- stack.assign( offset, offset.div( viewport.w ) );
219
+ offset.assign( offset.div( viewport.w ) );
222
220
 
223
221
  // select end
224
- stack.assign( clip, positionGeometry.y.lessThan( 0.5 ).cond( clipStart, clipEnd ) );
222
+ clip.assign( positionGeometry.y.lessThan( 0.5 ).cond( clipStart, clipEnd ) );
225
223
 
226
224
  // back to clip space
227
- stack.assign( offset, offset.mul( clip.w ) );
225
+ offset.assign( offset.mul( clip.w ) );
228
226
 
229
- stack.assign( clip, clip.add( vec4( offset, 0, 0 ) ) );
227
+ clip.assign( clip.add( vec4( offset, 0, 0 ) ) );
230
228
 
231
229
  }
232
230
 
233
231
  return clip;
234
232
 
235
- } );
233
+ } )();
236
234
 
237
235
  const closestLineToLine = tslFn( ( { p1, p2, p3, p4 } ) => {
238
236
 
@@ -241,25 +239,25 @@ class Line2NodeMaterial extends NodeMaterial {
241
239
 
242
240
  const p21 = p2.sub( p1 );
243
241
 
244
- const d1343 = dot( p13, p43 );
245
- const d4321 = dot( p43, p21 );
246
- const d1321 = dot( p13, p21 );
247
- const d4343 = dot( p43, p43 );
248
- const d2121 = dot( p21, p21 );
242
+ const d1343 = p13.dot( p43 );
243
+ const d4321 = p43.dot( p21 );
244
+ const d1321 = p13.dot( p21 );
245
+ const d4343 = p43.dot( p43 );
246
+ const d2121 = p21.dot( p21 );
249
247
 
250
248
  const denom = d2121.mul( d4343 ).sub( d4321.mul( d4321 ) );
251
249
  const numer = d1343.mul( d4321 ).sub( d1321.mul( d4343 ) );
252
250
 
253
- const mua = clamp( numer.div( denom ), 0, 1 );
254
- const mub = clamp( d1343.add( d4321.mul( mua ) ).div( d4343 ), 0, 1 );
251
+ const mua = numer.div( denom ).clamp();
252
+ const mub = d1343.add( d4321.mul( mua ) ).div( d4343 ).clamp();
255
253
 
256
254
  return vec2( mua, mub );
257
255
 
258
256
  } );
259
257
 
260
- this.colorNode = new ShaderNode( ( stack ) => {
258
+ this.fragmentNode = tslFn( () => {
261
259
 
262
- const vUv = varying( vec2(), 'vUv' );
260
+ const vUv = varyingProperty( 'vec2', 'vUv' );
263
261
 
264
262
  if ( useDash ) {
265
263
 
@@ -268,8 +266,8 @@ class Line2NodeMaterial extends NodeMaterial {
268
266
  const dashSizeNode = this.dashSizeNode ? float( this.dashSizeNode ) : materialLineDashSize;
269
267
  const gapSizeNode = this.dashSizeNode ? float( this.dashGapNode ) : materialLineGapSize;
270
268
 
271
- stack.assign( dashSize, dashSizeNode );
272
- stack.assign( gapSize, gapSizeNode );
269
+ dashSize.assign( dashSizeNode );
270
+ gapSize.assign( gapSizeNode );
273
271
 
274
272
  const instanceDistanceStart = attribute( 'instanceDistanceStart' );
275
273
  const instanceDistanceEnd = attribute( 'instanceDistanceEnd' );
@@ -279,23 +277,22 @@ class Line2NodeMaterial extends NodeMaterial {
279
277
  const vLineDistance = varying( lineDistance.add( materialLineDashOffset ) );
280
278
  const vLineDistanceOffset = offsetNode ? vLineDistance.add( offsetNode ) : vLineDistance;
281
279
 
282
- stack.add( vUv.y.lessThan( - 1.0 ).or( vUv.y.greaterThan( 1.0 ) ).discard() ); // discard endcaps
283
- stack.add( mod( vLineDistanceOffset, dashSize.add( gapSize ) ).greaterThan( dashSize ).discard() ); // todo - FIX
280
+ vUv.y.lessThan( - 1.0 ).or( vUv.y.greaterThan( 1.0 ) ).discard(); // discard endcaps
281
+ vLineDistanceOffset.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard(); // todo - FIX
284
282
 
285
283
  }
286
284
 
287
285
  // force assignment into correct place in flow
288
286
  const alpha = property( 'float', 'alpha' );
289
- stack.assign( alpha, 1 );
287
+ alpha.assign( 1 );
290
288
 
291
289
  if ( useWorldUnits ) {
292
290
 
293
-
294
- let worldStart = varying( vec3(), 'worldStart' );
295
- let worldEnd = varying( vec3(), 'worldEnd' );
291
+ const worldStart = varyingProperty( 'vec3', 'worldStart' );
292
+ const worldEnd = varyingProperty( 'vec3', 'worldEnd' );
296
293
 
297
294
  // Find the closest points on the view ray and the line segment
298
- const rayEnd = varying( vec4(), 'worldPos' ).xyz.normalize().mul( 1e5 );
295
+ const rayEnd = varyingProperty( 'vec4', 'worldPos' ).xyz.normalize().mul( 1e5 );
299
296
  const lineDir = worldEnd.sub( worldStart );
300
297
  const params = closestLineToLine( { p1: worldStart, p2: worldEnd, p3: vec3( 0.0, 0.0, 0.0 ), p4: rayEnd } );
301
298
 
@@ -310,11 +307,11 @@ class Line2NodeMaterial extends NodeMaterial {
310
307
  if ( useAlphaToCoverage ) {
311
308
 
312
309
  const dnorm = norm.fwidth();
313
- stack.assign( alpha, smoothstep( dnorm.negate().add( 0.5 ), dnorm.add( 0.5 ), norm ).oneMinus() );
310
+ alpha.assign( smoothstep( dnorm.negate().add( 0.5 ), dnorm.add( 0.5 ), norm ).oneMinus() );
314
311
 
315
312
  } else {
316
313
 
317
- stack.add( norm.greaterThan( 0.5 ).discard() );
314
+ norm.greaterThan( 0.5 ).discard();
318
315
 
319
316
  }
320
317
 
@@ -333,23 +330,23 @@ class Line2NodeMaterial extends NodeMaterial {
333
330
 
334
331
  // force assignment out of following 'if' statement - to avoid uniform control flow errors
335
332
  const dlen = property( 'float', 'dlen' );
336
- stack.assign( dlen, len2.fwidth() );
333
+ dlen.assign( len2.fwidth() );
337
334
 
338
- stack.if( abs( vUv.y ).greaterThan( 1.0 ), ( stack ) => {
335
+ If( vUv.y.abs().greaterThan( 1.0 ), () => {
339
336
 
340
- stack.assign( alpha, smoothstep( dlen.oneMinus(), dlen.add( 1 ), len2 ).oneMinus() );
337
+ alpha.assign( smoothstep( dlen.oneMinus(), dlen.add( 1 ), len2 ).oneMinus() );
341
338
 
342
339
  } );
343
340
 
344
341
  } else {
345
342
 
346
- stack.if( abs( vUv.y ).greaterThan( 1.0 ), ( stack ) => {
343
+ If( vUv.y.abs().greaterThan( 1.0 ), () => {
347
344
 
348
345
  const a = vUv.x;
349
346
  const b = vUv.y.greaterThan( 0.0 ).cond( vUv.y.sub( 1.0 ), vUv.y.add( 1.0 ) );
350
347
  const len2 = a.mul( a ).add( b.mul( b ) );
351
348
 
352
- stack.add( len2.greaterThan( 1.0 ).discard() );
349
+ len2.greaterThan( 1.0 ).discard();
353
350
 
354
351
  } );
355
352
 
@@ -370,7 +367,9 @@ class Line2NodeMaterial extends NodeMaterial {
370
367
  const instanceColorStart = attribute( 'instanceColorStart' );
371
368
  const instanceColorEnd = attribute( 'instanceColorEnd' );
372
369
 
373
- lineColorNode = varying( positionGeometry.y.lessThan( 0.5 ).cond( instanceColorStart, instanceColorEnd ) );
370
+ const instanceColor = positionGeometry.y.lessThan( 0.5 ).cond( instanceColorStart, instanceColorEnd );
371
+
372
+ lineColorNode = instanceColor.mul( materialColor );
374
373
 
375
374
  } else {
376
375
 
@@ -382,7 +381,7 @@ class Line2NodeMaterial extends NodeMaterial {
382
381
 
383
382
  return vec4( lineColorNode, alpha );
384
383
 
385
- } );
384
+ } )();
386
385
 
387
386
  this.needsUpdate = true;
388
387
 
@@ -1,7 +1,7 @@
1
1
  import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
2
2
  import { attribute } from '../core/AttributeNode.js';
3
3
  import { varying } from '../core/VaryingNode.js';
4
- import { materialLineDashSize, materialLineGapSize, materialLineScale } from '../accessors/LineMaterialNode.js';
4
+ import { materialLineDashSize, materialLineGapSize, materialLineScale } from '../accessors/MaterialNode.js';
5
5
  import { dashSize, gapSize } from '../core/PropertyNode.js';
6
6
  import { float } from '../shadernode/ShaderNode.js';
7
7
  import { LineDashedMaterial } from 'three';
@@ -30,20 +30,20 @@ class LineDashedNodeMaterial extends NodeMaterial {
30
30
 
31
31
  }
32
32
 
33
- setupVariants( { stack } ) {
33
+ setupVariants() {
34
34
 
35
35
  const offsetNode = this.offsetNode;
36
36
  const dashScaleNode = this.dashScaleNode ? float( this.dashScaleNode ) : materialLineScale;
37
37
  const dashSizeNode = this.dashSizeNode ? float( this.dashSizeNode ) : materialLineDashSize;
38
38
  const gapSizeNode = this.dashSizeNode ? float( this.dashGapNode ) : materialLineGapSize;
39
39
 
40
- stack.assign( dashSize, dashSizeNode );
41
- stack.assign( gapSize, gapSizeNode );
40
+ dashSize.assign( dashSizeNode );
41
+ gapSize.assign( gapSizeNode );
42
42
 
43
43
  const vLineDistance = varying( attribute( 'lineDistance' ).mul( dashScaleNode ) );
44
44
  const vLineDistanceOffset = offsetNode ? vLineDistance.add( offsetNode ) : vLineDistance;
45
45
 
46
- stack.add( vLineDistanceOffset.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard() );
46
+ vLineDistanceOffset.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard();
47
47
 
48
48
  }
49
49
 
@@ -1,6 +1,7 @@
1
1
  // @TODO: We can simplify "export { default as SomeNode, other, exports } from '...'" to just "export * from '...'" if we will use only named exports
2
2
 
3
3
  export { default as NodeMaterial, addNodeMaterial, createNodeMaterialFromType } from './NodeMaterial.js';
4
+ export { default as InstancedPointsNodeMaterial } from './InstancedPointsNodeMaterial.js';
4
5
  export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js';
5
6
  export { default as LineDashedNodeMaterial } from './LineDashedNodeMaterial.js';
6
7
  export { default as Line2NodeMaterial } from './Line2NodeMaterial.js';
@@ -13,6 +13,7 @@ class MeshBasicNodeMaterial extends NodeMaterial {
13
13
  this.isMeshBasicNodeMaterial = true;
14
14
 
15
15
  this.lights = false;
16
+ //this.normals = false; @TODO: normals usage by context
16
17
 
17
18
  this.setDefaultValues( defaultValues );
18
19
 
@@ -17,7 +17,7 @@ class MeshNormalNodeMaterial extends NodeMaterial {
17
17
 
18
18
  this.isMeshNormalNodeMaterial = true;
19
19
 
20
- this.colorSpace = false;
20
+ this.colorSpaced = false;
21
21
 
22
22
  this.setDefaultValues( defaultValues );
23
23
 
@@ -25,11 +25,11 @@ class MeshNormalNodeMaterial extends NodeMaterial {
25
25
 
26
26
  }
27
27
 
28
- setupDiffuseColor( { stack } ) {
28
+ setupDiffuseColor() {
29
29
 
30
30
  const opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity;
31
31
 
32
- stack.assign( diffuseColor, vec4( directionToColor( transformedNormalView ), opacityNode ) );
32
+ diffuseColor.assign( vec4( directionToColor( transformedNormalView ), opacityNode ) );
33
33
 
34
34
  }
35
35
 
@@ -33,19 +33,19 @@ class MeshPhongNodeMaterial extends NodeMaterial {
33
33
 
34
34
  }
35
35
 
36
- setupVariants( { stack } ) {
36
+ setupVariants() {
37
37
 
38
38
  // SHININESS
39
39
 
40
40
  const shininessNode = ( this.shininessNode ? float( this.shininessNode ) : materialShininess ).max( 1e-4 ); // to prevent pow( 0.0, 0.0 )
41
41
 
42
- stack.assign( shininess, shininessNode );
42
+ shininess.assign( shininessNode );
43
43
 
44
44
  // SPECULAR COLOR
45
45
 
46
46
  const specularNode = this.specularNode || materialSpecularColor;
47
47
 
48
- stack.assign( specularColor, specularNode );
48
+ specularColor.assign( specularNode );
49
49
 
50
50
  }
51
51
 
@@ -1,8 +1,7 @@
1
1
  import { addNodeMaterial } from './NodeMaterial.js';
2
2
  import { transformedClearcoatNormalView } from '../accessors/NormalNode.js';
3
3
  import { clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness } from '../core/PropertyNode.js';
4
- import { materialClearcoatNormal } from '../accessors/ExtendedMaterialNode.js';
5
- import { materialClearcoat, materialClearcoatRoughness, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness } from '../accessors/MaterialNode.js';
4
+ import { materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness } from '../accessors/MaterialNode.js';
6
5
  import { float, vec3 } from '../shadernode/ShaderNode.js';
7
6
  import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
8
7
  import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
@@ -44,9 +43,27 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
44
43
 
45
44
  }
46
45
 
46
+ get useClearcoat() {
47
+
48
+ return this.clearcoat > 0 || this.clearcoatNode !== null;
49
+
50
+ }
51
+
52
+ get useIridescence() {
53
+
54
+ return this.iridescence > 0 || this.iridescenceNode !== null;
55
+
56
+ }
57
+
58
+ get useSheen() {
59
+
60
+ return this.sheen > 0 || this.sheenNode !== null;
61
+
62
+ }
63
+
47
64
  setupLightingModel( /*builder*/ ) {
48
65
 
49
- return new PhysicalLightingModel(); // @TODO: Optimize shader using parameters.
66
+ return new PhysicalLightingModel( this.useClearcoat, this.useSheen, this.useIridescence );
50
67
 
51
68
  }
52
69
 
@@ -54,33 +71,43 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
54
71
 
55
72
  super.setupVariants( builder );
56
73
 
57
- const { stack } = builder;
58
-
59
74
  // CLEARCOAT
60
75
 
61
- const clearcoatNode = this.clearcoatNode ? float( this.clearcoatNode ) : materialClearcoat;
62
- const clearcoatRoughnessNode = this.clearcoatRoughnessNode ? float( this.clearcoatRoughnessNode ) : materialClearcoatRoughness;
76
+ if ( this.useClearcoat ) {
77
+
78
+ const clearcoatNode = this.clearcoatNode ? float( this.clearcoatNode ) : materialClearcoat;
79
+ const clearcoatRoughnessNode = this.clearcoatRoughnessNode ? float( this.clearcoatRoughnessNode ) : materialClearcoatRoughness;
80
+
81
+ clearcoat.assign( clearcoatNode );
82
+ clearcoatRoughness.assign( clearcoatRoughnessNode );
63
83
 
64
- stack.assign( clearcoat, clearcoatNode );
65
- stack.assign( clearcoatRoughness, clearcoatRoughnessNode );
84
+ }
66
85
 
67
86
  // SHEEN
68
87
 
69
- const sheenNode = this.sheenNode ? vec3( this.sheenNode ) : materialSheen;
70
- const sheenRoughnessNode = this.sheenRoughnessNode ? float( this.sheenRoughnessNode ) : materialSheenRoughness;
88
+ if ( this.useSheen ) {
71
89
 
72
- stack.assign( sheen, sheenNode );
73
- stack.assign( sheenRoughness, sheenRoughnessNode );
90
+ const sheenNode = this.sheenNode ? vec3( this.sheenNode ) : materialSheen;
91
+ const sheenRoughnessNode = this.sheenRoughnessNode ? float( this.sheenRoughnessNode ) : materialSheenRoughness;
92
+
93
+ sheen.assign( sheenNode );
94
+ sheenRoughness.assign( sheenRoughnessNode );
95
+
96
+ }
74
97
 
75
98
  // IRIDESCENCE
76
99
 
77
- const iridescenceNode = this.iridescenceNode ? float( this.iridescenceNode ) : materialIridescence;
78
- const iridescenceIORNode = this.iridescenceIORNode ? float( this.iridescenceIORNode ) : materialIridescenceIOR;
79
- const iridescenceThicknessNode = this.iridescenceThicknessNode ? float( this.iridescenceThicknessNode ) : materialIridescenceThickness;
100
+ if ( this.useIridescence ) {
101
+
102
+ const iridescenceNode = this.iridescenceNode ? float( this.iridescenceNode ) : materialIridescence;
103
+ const iridescenceIORNode = this.iridescenceIORNode ? float( this.iridescenceIORNode ) : materialIridescenceIOR;
104
+ const iridescenceThicknessNode = this.iridescenceThicknessNode ? float( this.iridescenceThicknessNode ) : materialIridescenceThickness;
105
+
106
+ iridescence.assign( iridescenceNode );
107
+ iridescenceIOR.assign( iridescenceIORNode );
108
+ iridescenceThickness.assign( iridescenceThicknessNode );
80
109
 
81
- stack.assign( iridescence, iridescenceNode );
82
- stack.assign( iridescenceIOR, iridescenceIORNode );
83
- stack.assign( iridescenceThickness, iridescenceThicknessNode );
110
+ }
84
111
 
85
112
  }
86
113
 
@@ -92,7 +119,7 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
92
119
 
93
120
  const clearcoatNormalNode = this.clearcoatNormalNode ? vec3( this.clearcoatNormalNode ) : materialClearcoatNormal;
94
121
 
95
- builder.stack.assign( transformedClearcoatNormalView, clearcoatNormalNode );
122
+ transformedClearcoatNormalView.assign( clearcoatNormalNode );
96
123
 
97
124
  }
98
125
 
@@ -31,34 +31,34 @@ class MeshStandardNodeMaterial extends NodeMaterial {
31
31
 
32
32
  setupLightingModel( /*builder*/ ) {
33
33
 
34
- return new PhysicalLightingModel( false, false ); // ( clearcoat, sheen ) -> standard
34
+ return new PhysicalLightingModel();
35
35
 
36
36
  }
37
37
 
38
- setupVariants( { stack } ) {
38
+ setupVariants() {
39
39
 
40
40
  // METALNESS
41
41
 
42
42
  const metalnessNode = this.metalnessNode ? float( this.metalnessNode ) : materialMetalness;
43
43
 
44
- stack.assign( metalness, metalnessNode );
44
+ metalness.assign( metalnessNode );
45
45
 
46
46
  // ROUGHNESS
47
47
 
48
48
  let roughnessNode = this.roughnessNode ? float( this.roughnessNode ) : materialRoughness;
49
49
  roughnessNode = getRoughness( { roughness: roughnessNode } );
50
50
 
51
- stack.assign( roughness, roughnessNode );
51
+ roughness.assign( roughnessNode );
52
52
 
53
53
  // SPECULAR COLOR
54
54
 
55
55
  const specularColorNode = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessNode );
56
56
 
57
- stack.assign( specularColor, specularColorNode );
57
+ specularColor.assign( specularColorNode );
58
58
 
59
59
  // DIFFUSE COLOR
60
60
 
61
- stack.assign( diffuseColor, vec4( diffuseColor.rgb.mul( metalnessNode.oneMinus() ), diffuseColor.a ) );
61
+ diffuseColor.assign( vec4( diffuseColor.rgb.mul( metalnessNode.oneMinus() ), diffuseColor.a ) );
62
62
 
63
63
  }
64
64