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
@@ -9,7 +9,7 @@ import LightingModel from '../core/LightingModel.js';
9
9
  import { diffuseColor, specularColor, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness } from '../core/PropertyNode.js';
10
10
  import { transformedNormalView, transformedClearcoatNormalView } from '../accessors/NormalNode.js';
11
11
  import { positionViewDirection } from '../accessors/PositionNode.js';
12
- import { float, vec3, mat3 } from '../shadernode/ShaderNode.js';
12
+ import { tslFn, float, vec3, mat3 } from '../shadernode/ShaderNode.js';
13
13
  import { cond } from '../math/CondNode.js';
14
14
  import { mix, smoothstep } from '../math/MathNode.js';
15
15
 
@@ -56,11 +56,12 @@ const evalSensitivity = ( OPD, shift ) => {
56
56
  xyz = vec3( xyz.x.add( x ), xyz.y, xyz.z ).div( 1.0685e-7 );
57
57
 
58
58
  const rgb = XYZ_TO_REC709.mul( xyz );
59
+
59
60
  return rgb;
60
61
 
61
62
  };
62
63
 
63
- const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0 ) => {
64
+ const evalIridescence = tslFn( ( { outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0 } ) => {
64
65
 
65
66
  // Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0
66
67
  const iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );
@@ -121,7 +122,17 @@ const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0
121
122
  // Since out of gamut colors might be produced, negative color values are clamped to 0.
122
123
  return I.max( vec3( 0.0 ) );
123
124
 
124
- };
125
+ } ).setLayout( {
126
+ name: 'evalIridescence',
127
+ type: 'vec3',
128
+ inputs: [
129
+ { name: 'outsideIOR', type: 'float' },
130
+ { name: 'eta2', type: 'float' },
131
+ { name: 'cosTheta1', type: 'float' },
132
+ { name: 'thinFilmThickness', type: 'float' },
133
+ { name: 'baseF0', type: 'vec3' }
134
+ ]
135
+ } );
125
136
 
126
137
  //
127
138
  // Sheen
@@ -130,7 +141,7 @@ const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0
130
141
  // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from
131
142
  // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found
132
143
  // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
133
- const IBLSheenBRDF = ( normal, viewDir, roughness ) => {
144
+ const IBLSheenBRDF = tslFn( ( { normal, viewDir, roughness } ) => {
134
145
 
135
146
  const dotNV = normal.dot( viewDir ).saturate();
136
147
 
@@ -152,7 +163,7 @@ const IBLSheenBRDF = ( normal, viewDir, roughness ) => {
152
163
 
153
164
  return DG.mul( 1.0 / Math.PI ).saturate();
154
165
 
155
- };
166
+ } );
156
167
 
157
168
  const clearcoatF0 = vec3( 0.04 );
158
169
  const clearcoatF90 = vec3( 1 );
@@ -161,7 +172,7 @@ const clearcoatF90 = vec3( 1 );
161
172
 
162
173
  class PhysicalLightingModel extends LightingModel {
163
174
 
164
- constructor( clearcoat = true, sheen = true, iridescence = true ) {
175
+ constructor( clearcoat = false, sheen = false, iridescence = false ) {
165
176
 
166
177
  super();
167
178
 
@@ -170,45 +181,29 @@ class PhysicalLightingModel extends LightingModel {
170
181
  this.iridescence = iridescence;
171
182
 
172
183
  this.clearcoatRadiance = null;
173
- this.clearcoatSpecular = null;
174
- this.sheenSpecular = null;
184
+ this.clearcoatSpecularDirect = null;
185
+ this.clearcoatSpecularIndirect = null;
186
+ this.sheenSpecularDirect = null;
187
+ this.sheenSpecularIndirect = null;
175
188
  this.iridescenceFresnel = null;
176
189
  this.iridescenceF0 = null;
177
190
 
178
191
  }
179
192
 
180
- init( { reflectedLight } ) {
193
+ start( /*context*/ ) {
181
194
 
182
195
  if ( this.clearcoat === true ) {
183
196
 
184
- this.clearcoatRadiance = vec3().temp();
185
- this.clearcoatSpecular = vec3().temp();
186
-
187
- const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
188
-
189
- const Fcc = F_Schlick( {
190
- dotVH: dotNVcc,
191
- f0: clearcoatF0,
192
- f90: clearcoatF90
193
- } );
194
-
195
- const outgoingLight = reflectedLight.total;
196
- const clearcoatLight = outgoingLight.mul( clearcoat.mul( Fcc ).oneMinus() ).add( this.clearcoatSpecular.mul( clearcoat ) );
197
-
198
- outgoingLight.assign( clearcoatLight );
197
+ this.clearcoatRadiance = vec3().temp( 'clearcoatRadiance' );
198
+ this.clearcoatSpecularDirect = vec3().temp( 'clearcoatSpecularDirect' );
199
+ this.clearcoatSpecularIndirect = vec3().temp( 'clearcoatSpecularIndirect' );
199
200
 
200
201
  }
201
202
 
202
203
  if ( this.sheen === true ) {
203
204
 
204
- this.sheenSpecular = vec3().temp();
205
-
206
- const outgoingLight = reflectedLight.total;
207
-
208
- const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( 0.157 ).oneMinus();
209
- const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecular );
210
-
211
- outgoingLight.assign( sheenLight );
205
+ this.sheenSpecularDirect = vec3().temp( 'sheenSpecularDirect' );
206
+ this.sheenSpecularIndirect = vec3().temp( 'sheenSpecularIndirect' );
212
207
 
213
208
  }
214
209
 
@@ -216,7 +211,14 @@ class PhysicalLightingModel extends LightingModel {
216
211
 
217
212
  const dotNVi = transformedNormalView.dot( positionViewDirection ).clamp();
218
213
 
219
- this.iridescenceFresnel = evalIridescence( float( 1.0 ), iridescenceIOR, dotNVi, iridescenceThickness, specularColor );
214
+ this.iridescenceFresnel = evalIridescence( {
215
+ outsideIOR: float( 1.0 ),
216
+ eta2: iridescenceIOR,
217
+ cosTheta1: dotNVi,
218
+ thinFilmThickness: iridescenceThickness,
219
+ baseF0: specularColor
220
+ } );
221
+
220
222
  this.iridescenceF0 = Schlick_to_F0( { f: this.iridescenceFresnel, f90: 1.0, dotVH: dotNVi } );
221
223
 
222
224
  }
@@ -229,7 +231,9 @@ class PhysicalLightingModel extends LightingModel {
229
231
 
230
232
  computeMultiscattering( singleScatter, multiScatter, specularF90 = float( 1 ) ) {
231
233
 
232
- const fab = DFGApprox( { roughness } );
234
+ const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
235
+
236
+ const fab = DFGApprox( { roughness, dotNV } );
233
237
 
234
238
  const Fr = this.iridescenceF0 ? iridescence.mix( specularColor, this.iridescenceF0 ) : specularColor;
235
239
 
@@ -253,7 +257,7 @@ class PhysicalLightingModel extends LightingModel {
253
257
 
254
258
  if ( this.sheen === true ) {
255
259
 
256
- this.sheenSpecular.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );
260
+ this.sheenSpecularDirect.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );
257
261
 
258
262
  }
259
263
 
@@ -262,7 +266,7 @@ class PhysicalLightingModel extends LightingModel {
262
266
  const dotNLcc = transformedClearcoatNormalView.dot( lightDirection ).clamp();
263
267
  const ccIrradiance = dotNLcc.mul( lightColor );
264
268
 
265
- this.clearcoatSpecular.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: transformedClearcoatNormalView } ) ) );
269
+ this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: transformedClearcoatNormalView } ) ) );
266
270
 
267
271
  }
268
272
 
@@ -278,13 +282,17 @@ class PhysicalLightingModel extends LightingModel {
278
282
 
279
283
  }
280
284
 
281
- indirectSpecular( { radiance, iblIrradiance, reflectedLight, } ) {
285
+ indirectSpecular( { radiance, iblIrradiance, reflectedLight } ) {
282
286
 
283
287
  if ( this.sheen === true ) {
284
288
 
285
- this.sheenSpecular.addAssign( iblIrradiance.mul(
289
+ this.sheenSpecularIndirect.addAssign( iblIrradiance.mul(
286
290
  sheen,
287
- IBLSheenBRDF( transformedNormalView, positionViewDirection, sheenRoughness )
291
+ IBLSheenBRDF( {
292
+ normal: transformedNormalView,
293
+ viewDir: positionViewDirection,
294
+ roughness: sheenRoughness
295
+ } )
288
296
  ) );
289
297
 
290
298
  }
@@ -300,14 +308,14 @@ class PhysicalLightingModel extends LightingModel {
300
308
  roughness: clearcoatRoughness
301
309
  } );
302
310
 
303
- this.clearcoatSpecular.addAssign( this.clearcoatRadiance.mul( clearcoatEnv ) );
311
+ this.clearcoatSpecularIndirect.addAssign( this.clearcoatRadiance.mul( clearcoatEnv ) );
304
312
 
305
313
  }
306
314
 
307
315
  // Both indirect specular and indirect diffuse light accumulate here
308
316
 
309
- const singleScattering = vec3().temp();
310
- const multiScattering = vec3().temp();
317
+ const singleScattering = vec3().temp( 'singleScattering' );
318
+ const multiScattering = vec3().temp( 'multiScattering' );
311
319
  const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );
312
320
 
313
321
  this.computeMultiscattering( singleScattering, multiScattering );
@@ -332,12 +340,54 @@ class PhysicalLightingModel extends LightingModel {
332
340
 
333
341
  const aoNode = ambientOcclusion.sub( aoNV.pow( aoExp ).oneMinus() ).clamp();
334
342
 
335
- reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );
343
+ if ( this.clearcoat === true ) {
344
+
345
+ this.clearcoatSpecularIndirect.mulAssign( ambientOcclusion );
346
+
347
+ }
348
+
349
+ if ( this.sheen === true ) {
350
+
351
+ this.sheenSpecularIndirect.mulAssign( ambientOcclusion );
336
352
 
353
+ }
354
+
355
+ reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );
337
356
  reflectedLight.indirectSpecular.mulAssign( aoNode );
338
357
 
339
358
  }
340
359
 
360
+ finish( context ) {
361
+
362
+ const { outgoingLight } = context;
363
+
364
+ if ( this.clearcoat === true ) {
365
+
366
+ const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
367
+
368
+ const Fcc = F_Schlick( {
369
+ dotVH: dotNVcc,
370
+ f0: clearcoatF0,
371
+ f90: clearcoatF90
372
+ } );
373
+
374
+ const clearcoatLight = outgoingLight.mul( clearcoat.mul( Fcc ).oneMinus() ).add( this.clearcoatSpecularDirect.add( this.clearcoatSpecularIndirect ).mul( clearcoat ) );
375
+
376
+ outgoingLight.assign( clearcoatLight );
377
+
378
+ }
379
+
380
+ if ( this.sheen === true ) {
381
+
382
+ const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( 0.157 ).oneMinus();
383
+ const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
384
+
385
+ outgoingLight.assign( sheenLight );
386
+
387
+ }
388
+
389
+ }
390
+
341
391
  }
342
392
 
343
393
  export default PhysicalLightingModel;
@@ -17,7 +17,7 @@ class ComputeNode extends Node {
17
17
  this.dispatchCount = 0;
18
18
 
19
19
  this.version = 1;
20
- this.updateType = NodeUpdateType.OBJECT;
20
+ this.updateBeforeType = NodeUpdateType.OBJECT;
21
21
 
22
22
  this.updateDispatchCount();
23
23
 
@@ -50,7 +50,7 @@ class ComputeNode extends Node {
50
50
 
51
51
  onInit() { }
52
52
 
53
- update( { renderer } ) {
53
+ updateBefore( { renderer } ) {
54
54
 
55
55
  renderer.compute( this );
56
56
 
@@ -14,7 +14,7 @@ class AmbientLightNode extends AnalyticLightNode {
14
14
 
15
15
  setup( { context } ) {
16
16
 
17
- context.irradiance.addAssign( this.colorNode );
17
+ context.irradiance.addAssign(this.colorNode );
18
18
 
19
19
  }
20
20
 
@@ -7,6 +7,7 @@ import { reference } from '../accessors/ReferenceNode.js';
7
7
  import { texture } from '../accessors/TextureNode.js';
8
8
  import { positionWorld } from '../accessors/PositionNode.js';
9
9
  import { normalWorld } from '../accessors/NormalNode.js';
10
+ import { WebGPUCoordinateSystem } from 'three';
10
11
  //import { add } from '../math/OperatorNode.js';
11
12
 
12
13
  import { Color, DepthTexture, NearestFilter, LessCompare } from 'three';
@@ -27,11 +28,21 @@ class AnalyticLightNode extends LightingNode {
27
28
  this.shadowNode = null;
28
29
 
29
30
  this.color = new Color();
30
- this.colorNode = uniform( this.color );
31
+ this._defaultColorNode = uniform( this.color );
32
+
33
+ this.colorNode = this._defaultColorNode;
34
+
35
+ this.isAnalyticLightNode = true;
31
36
 
32
37
  }
33
38
 
34
- getHash( /*builder*/ ) {
39
+ getCacheKey() {
40
+
41
+ return super.getCacheKey() + '-' + ( this.light.id + '-' + ( this.light.castShadow ? '1' : '0' ) );
42
+
43
+ }
44
+
45
+ getHash() {
35
46
 
36
47
  return this.light.uuid;
37
48
 
@@ -73,10 +84,18 @@ class AnalyticLightNode extends LightingNode {
73
84
  .and( shadowCoord.y.lessThanEqual( 1 ) )
74
85
  .and( shadowCoord.z.lessThanEqual( 1 ) );
75
86
 
87
+ let coordZ = shadowCoord.z.add( bias );
88
+
89
+ if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
90
+
91
+ coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Convertion [ 0, 1 ] to [ - 1, 1 ]
92
+
93
+ }
94
+
76
95
  shadowCoord = vec3(
77
96
  shadowCoord.x,
78
- shadowCoord.y.oneMinus(), // WebGPU: Flip Y
79
- shadowCoord.z.add( bias ).mul( 2 ).sub( 1 ) // WebGPU: Convertion [ 0, 1 ] to [ - 1, 1 ]
97
+ shadowCoord.y.oneMinus(), // follow webgpu standards
98
+ coordZ
80
99
  );
81
100
 
82
101
  const textureCompare = ( depthTexture, shadowCoord, compare ) => texture( depthTexture, shadowCoord ).compare( compare );
@@ -139,6 +158,7 @@ class AnalyticLightNode extends LightingNode {
139
158
  setup( builder ) {
140
159
 
141
160
  if ( this.light.castShadow ) this.setupShadow( builder );
161
+ else if ( this.shadowNode !== null ) this.disposeShadow();
142
162
 
143
163
  }
144
164
 
@@ -147,17 +167,46 @@ class AnalyticLightNode extends LightingNode {
147
167
  const { rtt, light } = this;
148
168
  const { renderer, scene } = frame;
149
169
 
170
+ const currentOverrideMaterial = scene.overrideMaterial;
171
+
150
172
  scene.overrideMaterial = depthMaterial;
151
173
 
152
174
  rtt.setSize( light.shadow.mapSize.width, light.shadow.mapSize.height );
153
175
 
154
176
  light.shadow.updateMatrices( light );
155
177
 
178
+ const currentRenderTarget = renderer.getRenderTarget();
179
+ const currentRenderObjectFunction = renderer.getRenderObjectFunction();
180
+
181
+ renderer.setRenderObjectFunction( ( object, ...params ) => {
182
+
183
+ if ( object.castShadow === true ) {
184
+
185
+ renderer.renderObject( object, ...params );
186
+
187
+ }
188
+
189
+ } );
190
+
156
191
  renderer.setRenderTarget( rtt );
192
+
157
193
  renderer.render( scene, light.shadow.camera );
158
- renderer.setRenderTarget( null );
159
194
 
160
- scene.overrideMaterial = null;
195
+ renderer.setRenderTarget( currentRenderTarget );
196
+ renderer.setRenderObjectFunction( currentRenderObjectFunction );
197
+
198
+ scene.overrideMaterial = currentOverrideMaterial;
199
+
200
+ }
201
+
202
+ disposeShadow() {
203
+
204
+ this.rtt.dispose();
205
+
206
+ this.shadowNode = null;
207
+ this.rtt = null;
208
+
209
+ this.colorNode = this._defaultColorNode;
161
210
 
162
211
  }
163
212
 
@@ -27,7 +27,7 @@ class DirectionalLightNode extends AnalyticLightNode {
27
27
  lightDirection,
28
28
  lightColor,
29
29
  reflectedLight
30
- } );
30
+ }, builder.stack, builder );
31
31
 
32
32
  }
33
33
 
@@ -1,6 +1,7 @@
1
1
  import LightingNode from './LightingNode.js';
2
2
  import { cache } from '../core/CacheNode.js';
3
3
  import { context } from '../core/ContextNode.js';
4
+ import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
4
5
  import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
5
6
  import { equirectUV } from '../utils/EquirectUVNode.js';
6
7
  import { specularMIPLevel } from '../utils/SpecularMIPLevelNode.js';
@@ -8,7 +9,7 @@ import { cameraViewMatrix } from '../accessors/CameraNode.js';
8
9
  import { transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld } from '../accessors/NormalNode.js';
9
10
  import { positionViewDirection } from '../accessors/PositionNode.js';
10
11
  import { addNodeClass } from '../core/Node.js';
11
- import { float, vec2 } from '../shadernode/ShaderNode.js';
12
+ import { vec2 } from '../shadernode/ShaderNode.js';
12
13
  import { cubeTexture } from '../accessors/CubeTextureNode.js';
13
14
  import { reference } from '../accessors/ReferenceNode.js';
14
15
 
@@ -27,7 +28,6 @@ class EnvironmentNode extends LightingNode {
27
28
  setup( builder ) {
28
29
 
29
30
  let envNode = this.envNode;
30
- const properties = builder.getNodeProperties( this );
31
31
 
32
32
  if ( envNode.isTextureNode && envNode.value.isCubeTexture !== true ) {
33
33
 
@@ -79,11 +79,6 @@ class EnvironmentNode extends LightingNode {
79
79
 
80
80
  }
81
81
 
82
- //
83
-
84
- properties.radiance = isolateRadiance;
85
- properties.irradiance = irradiance;
86
-
87
82
  }
88
83
 
89
84
  }
@@ -94,7 +89,7 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
94
89
  let textureUVNode = null;
95
90
 
96
91
  return {
97
- getUVNode: ( textureNode ) => {
92
+ getUV: ( textureNode ) => {
98
93
 
99
94
  let node = null;
100
95
 
@@ -127,12 +122,12 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
127
122
  return node;
128
123
 
129
124
  },
130
- getSamplerLevelNode: () => {
125
+ getTextureLevel: () => {
131
126
 
132
127
  return roughnessNode;
133
128
 
134
129
  },
135
- getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => {
130
+ getTextureLevelAlgorithm: ( textureNode, levelNode ) => {
136
131
 
137
132
  return specularMIPLevel( textureNode, levelNode );
138
133
 
@@ -146,7 +141,7 @@ const createIrradianceContext = ( normalWorldNode ) => {
146
141
  let textureUVNode = null;
147
142
 
148
143
  return {
149
- getUVNode: ( textureNode ) => {
144
+ getUV: ( textureNode ) => {
150
145
 
151
146
  let node = null;
152
147
 
@@ -172,14 +167,9 @@ const createIrradianceContext = ( normalWorldNode ) => {
172
167
  return node;
173
168
 
174
169
  },
175
- getSamplerLevelNode: () => {
176
-
177
- return float( 1 );
170
+ getTextureLevel: ( textureNode ) => {
178
171
 
179
- },
180
- getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => {
181
-
182
- return specularMIPLevel( textureNode, levelNode );
172
+ return maxMipLevel( textureNode );
183
173
 
184
174
  }
185
175
  };
@@ -1,6 +1,4 @@
1
1
  import ContextNode from '../core/ContextNode.js';
2
- import { add } from '../math/OperatorNode.js';
3
- import { mix } from '../math/MathNode.js';
4
2
  import { addNodeClass } from '../core/Node.js';
5
3
  import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js';
6
4
 
@@ -14,80 +12,46 @@ class LightingContextNode extends ContextNode {
14
12
  this.backdropNode = backdropNode;
15
13
  this.backdropAlphaNode = backdropAlphaNode;
16
14
 
17
- }
18
-
19
- getNodeType( /*builder*/ ) {
20
-
21
- return 'vec3';
15
+ this._context = null;
22
16
 
23
17
  }
24
18
 
25
- setup( builder ) {
26
-
27
- const { lightingModel, backdropNode, backdropAlphaNode } = this;
28
-
29
- const context = this.context = {}; // reset context
30
- const properties = builder.getNodeProperties( this );
31
-
32
- const directDiffuse = vec3().temp(),
33
- directSpecular = vec3().temp(),
34
- indirectDiffuse = vec3().temp(),
35
- indirectSpecular = vec3().temp();
36
-
37
- let totalDiffuse = add( directDiffuse, indirectDiffuse );
38
-
39
- if ( backdropNode !== null ) {
40
-
41
- totalDiffuse = vec3( backdropAlphaNode !== null ? mix( totalDiffuse, backdropNode, backdropAlphaNode ) : backdropNode );
19
+ getContext() {
42
20
 
43
- }
21
+ const { backdropNode, backdropAlphaNode } = this;
44
22
 
45
- const totalSpecular = add( directSpecular, indirectSpecular );
46
- const total = add( totalDiffuse, totalSpecular ).temp();
23
+ const directDiffuse = vec3().temp( 'directDiffuse' ),
24
+ directSpecular = vec3().temp( 'directSpecular' ),
25
+ indirectDiffuse = vec3().temp( 'indirectDiffuse' ),
26
+ indirectSpecular = vec3().temp( 'indirectSpecular' );
47
27
 
48
28
  const reflectedLight = {
49
29
  directDiffuse,
50
30
  directSpecular,
51
31
  indirectDiffuse,
52
- indirectSpecular,
53
- total
32
+ indirectSpecular
54
33
  };
55
34
 
56
- const lighting = {
57
- radiance: vec3().temp(),
58
- irradiance: vec3().temp(),
59
- iblIrradiance: vec3().temp(),
60
- ambientOcclusion: float( 1 ).temp()
35
+ const context = {
36
+ radiance: vec3().temp( 'radiance' ),
37
+ irradiance: vec3().temp( 'irradiance' ),
38
+ iblIrradiance: vec3().temp( 'iblIrradiance' ),
39
+ ambientOcclusion: float( 1 ).temp( 'ambientOcclusion' ),
40
+ reflectedLight,
41
+ backdrop: backdropNode,
42
+ backdropAlpha : backdropAlphaNode
61
43
  };
62
44
 
63
- context.reflectedLight = reflectedLight;
64
- context.lightingModel = lightingModel || context.lightingModel;
65
-
66
- Object.assign( properties, reflectedLight, lighting );
67
- Object.assign( context, lighting );
68
-
69
- if ( lightingModel ) {
70
-
71
- lightingModel.init( context, builder.stack, builder );
72
-
73
- lightingModel.indirectDiffuse( context, builder.stack, builder );
74
- lightingModel.indirectSpecular( context, builder.stack, builder );
75
- lightingModel.ambientOcclusion( context, builder.stack, builder );
76
-
77
- }
78
-
79
- return super.setup( builder );
45
+ return context;
80
46
 
81
47
  }
82
48
 
83
- generate( builder ) {
84
-
85
- const { context } = this;
86
- const type = this.getNodeType( builder );
49
+ setup( builder ) {
87
50
 
88
- super.generate( builder, type );
51
+ this.context = this._context || ( this._context = this.getContext() );
52
+ this.context.lightingModel = this.lightingModel || builder.context.lightingModel;
89
53
 
90
- return context.reflectedLight.total.build( builder, type );
54
+ return super.setup( builder );
91
55
 
92
56
  }
93
57