super-three 0.141.0 → 0.144.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 (353) hide show
  1. package/README.md +8 -8
  2. package/build/three.cjs +1558 -1034
  3. package/build/three.js +1558 -1034
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +2012 -1243
  6. package/examples/js/animation/MMDPhysics.js +1 -16
  7. package/examples/js/controls/ArcballControls.js +16 -3
  8. package/examples/js/controls/FirstPersonControls.js +0 -7
  9. package/examples/js/controls/FlyControls.js +0 -8
  10. package/examples/js/controls/OrbitControls.js +0 -4
  11. package/examples/js/controls/PointerLockControls.js +0 -8
  12. package/examples/js/controls/TrackballControls.js +0 -2
  13. package/examples/js/controls/TransformControls.js +20 -16
  14. package/examples/js/effects/AnaglyphEffect.js +2 -2
  15. package/examples/js/effects/OutlineEffect.js +4 -24
  16. package/examples/js/effects/ParallaxBarrierEffect.js +2 -2
  17. package/examples/js/effects/PeppersGhostEffect.js +2 -2
  18. package/examples/js/effects/StereoEffect.js +2 -2
  19. package/examples/js/environments/RoomEnvironment.js +22 -0
  20. package/examples/js/exporters/ColladaExporter.js +4 -13
  21. package/examples/js/exporters/DRACOExporter.js +0 -12
  22. package/examples/js/exporters/GLTFExporter.js +28 -29
  23. package/examples/js/exporters/OBJExporter.js +2 -23
  24. package/examples/js/exporters/PLYExporter.js +12 -24
  25. package/examples/js/exporters/STLExporter.js +0 -7
  26. package/examples/js/exporters/USDZExporter.js +6 -0
  27. package/examples/js/geometries/ConvexGeometry.js +1 -1
  28. package/examples/js/geometries/ParametricGeometry.js +1 -8
  29. package/examples/js/interactive/SelectionHelper.js +2 -0
  30. package/examples/js/libs/ktx-parse.umd.js +1 -0
  31. package/examples/js/libs/meshopt_decoder.js +98 -32
  32. package/examples/js/loaders/ColladaLoader.js +1 -0
  33. package/examples/js/loaders/DRACOLoader.js +2 -25
  34. package/examples/js/loaders/EXRLoader.js +2 -13
  35. package/examples/js/loaders/FBXLoader.js +10 -3
  36. package/examples/js/loaders/FontLoader.js +3 -16
  37. package/examples/js/loaders/GLTFLoader.js +52 -36
  38. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -11
  39. package/examples/js/loaders/LDrawLoader.js +139 -74
  40. package/examples/js/loaders/OBJLoader.js +7 -13
  41. package/examples/js/loaders/PCDLoader.js +59 -14
  42. package/examples/js/loaders/PLYLoader.js +3 -3
  43. package/examples/js/loaders/SVGLoader.js +4 -3
  44. package/examples/js/loaders/TIFFLoader.js +31 -0
  45. package/examples/js/loaders/VRMLLoader.js +33 -24
  46. package/examples/js/loaders/VTKLoader.js +1 -1
  47. package/examples/js/loaders/lwo/LWO2Parser.js +8 -7
  48. package/examples/js/loaders/lwo/LWO3Parser.js +8 -7
  49. package/examples/js/materials/MeshGouraudMaterial.js +385 -0
  50. package/examples/js/math/ColorConverter.js +0 -50
  51. package/examples/js/misc/GPUComputationRenderer.js +23 -0
  52. package/examples/js/misc/Volume.js +198 -190
  53. package/examples/js/misc/VolumeSlice.js +90 -88
  54. package/examples/js/modifiers/SimplifyModifier.js +1 -1
  55. package/examples/js/objects/GroundProjectedEnv.js +193 -0
  56. package/examples/js/objects/Reflector.js +9 -2
  57. package/examples/js/objects/ReflectorForSSRPass.js +3 -4
  58. package/examples/js/objects/Refractor.js +10 -4
  59. package/examples/js/objects/ShadowMesh.js +5 -1
  60. package/examples/js/postprocessing/OutlinePass.js +5 -3
  61. package/examples/js/renderers/CSS2DRenderer.js +2 -2
  62. package/examples/js/renderers/CSS3DRenderer.js +2 -2
  63. package/examples/js/renderers/Projector.js +2 -23
  64. package/examples/js/shaders/LuminosityShader.js +1 -1
  65. package/examples/js/shaders/MMDToonShader.js +6 -2
  66. package/examples/js/shaders/ToneMapShader.js +1 -1
  67. package/examples/js/utils/BufferGeometryUtils.js +1 -1
  68. package/examples/js/utils/GeometryUtils.js +2 -18
  69. package/examples/js/utils/PackedPhongMaterial.js +1 -1
  70. package/examples/js/utils/SceneUtils.js +0 -16
  71. package/examples/jsm/animation/MMDPhysics.js +3 -22
  72. package/examples/jsm/controls/ArcballControls.js +17 -2
  73. package/examples/jsm/controls/FirstPersonControls.js +0 -7
  74. package/examples/jsm/controls/FlyControls.js +0 -7
  75. package/examples/jsm/controls/OrbitControls.js +0 -5
  76. package/examples/jsm/controls/PointerLockControls.js +0 -7
  77. package/examples/jsm/controls/TrackballControls.js +0 -3
  78. package/examples/jsm/controls/TransformControls.js +18 -16
  79. package/examples/jsm/effects/AnaglyphEffect.js +2 -2
  80. package/examples/jsm/effects/OutlineEffect.js +4 -25
  81. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -2
  82. package/examples/jsm/effects/PeppersGhostEffect.js +2 -2
  83. package/examples/jsm/effects/StereoEffect.js +2 -2
  84. package/examples/jsm/environments/RoomEnvironment.js +23 -0
  85. package/examples/jsm/exporters/ColladaExporter.js +4 -13
  86. package/examples/jsm/exporters/DRACOExporter.js +0 -13
  87. package/examples/jsm/exporters/GLTFExporter.js +29 -31
  88. package/examples/jsm/exporters/KTX2Exporter.js +29 -29
  89. package/examples/jsm/exporters/OBJExporter.js +0 -18
  90. package/examples/jsm/exporters/PLYExporter.js +14 -22
  91. package/examples/jsm/exporters/STLExporter.js +1 -9
  92. package/examples/jsm/exporters/USDZExporter.js +14 -3
  93. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  94. package/examples/jsm/geometries/ParametricGeometry.js +0 -6
  95. package/examples/jsm/interactive/HTMLMesh.js +9 -9
  96. package/examples/jsm/interactive/SelectionHelper.js +5 -3
  97. package/examples/jsm/libs/meshopt_decoder.module.js +97 -32
  98. package/examples/jsm/libs/utif.module.js +1579 -0
  99. package/examples/jsm/libs/zstddec.module.js +1 -0
  100. package/examples/jsm/loaders/ColladaLoader.js +1 -0
  101. package/examples/jsm/loaders/DRACOLoader.js +2 -28
  102. package/examples/jsm/loaders/EXRLoader.js +3 -13
  103. package/examples/jsm/loaders/FBXLoader.js +10 -3
  104. package/examples/jsm/loaders/FontLoader.js +3 -16
  105. package/examples/jsm/loaders/GLTFLoader.js +52 -36
  106. package/examples/jsm/loaders/HDRCubeTextureLoader.js +0 -13
  107. package/examples/jsm/loaders/KTX2Loader.js +192 -30
  108. package/examples/jsm/loaders/LDrawLoader.js +135 -74
  109. package/examples/jsm/loaders/OBJLoader.js +6 -14
  110. package/examples/jsm/loaders/PCDLoader.js +59 -13
  111. package/examples/jsm/loaders/PLYLoader.js +3 -3
  112. package/examples/jsm/loaders/RGBELoader.js +1 -1
  113. package/examples/jsm/loaders/SVGLoader.js +4 -3
  114. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  115. package/examples/jsm/loaders/USDZLoader.js +393 -0
  116. package/examples/jsm/loaders/VRMLLoader.js +23 -25
  117. package/examples/jsm/loaders/VTKLoader.js +1 -1
  118. package/examples/jsm/loaders/lwo/LWO2Parser.js +6 -8
  119. package/examples/jsm/loaders/lwo/LWO3Parser.js +6 -8
  120. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  121. package/examples/jsm/math/ColorConverter.js +1 -49
  122. package/examples/jsm/misc/GPUComputationRenderer.js +43 -0
  123. package/examples/jsm/misc/Volume.js +169 -171
  124. package/examples/jsm/misc/VolumeSlice.js +78 -80
  125. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  126. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +1 -1
  127. package/examples/jsm/node-editor/accessors/NormalEditor.js +1 -1
  128. package/examples/jsm/node-editor/accessors/PositionEditor.js +1 -1
  129. package/examples/jsm/node-editor/accessors/UVEditor.js +1 -1
  130. package/examples/jsm/node-editor/display/BlendEditor.js +1 -1
  131. package/examples/jsm/node-editor/display/NormalMapEditor.js +1 -1
  132. package/examples/jsm/node-editor/inputs/ColorEditor.js +1 -1
  133. package/examples/jsm/node-editor/inputs/FloatEditor.js +1 -1
  134. package/examples/jsm/node-editor/inputs/SliderEditor.js +1 -1
  135. package/examples/jsm/node-editor/inputs/TextureEditor.js +1 -1
  136. package/examples/jsm/node-editor/inputs/Vector2Editor.js +1 -1
  137. package/examples/jsm/node-editor/inputs/Vector3Editor.js +1 -1
  138. package/examples/jsm/node-editor/inputs/Vector4Editor.js +1 -1
  139. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +1 -1
  140. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +1 -1
  141. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +1 -1
  142. package/examples/jsm/node-editor/math/AngleEditor.js +1 -1
  143. package/examples/jsm/node-editor/math/DotEditor.js +1 -1
  144. package/examples/jsm/node-editor/math/InvertEditor.js +1 -1
  145. package/examples/jsm/node-editor/math/LimiterEditor.js +1 -1
  146. package/examples/jsm/node-editor/math/NormalizeEditor.js +1 -1
  147. package/examples/jsm/node-editor/math/OperatorEditor.js +1 -1
  148. package/examples/jsm/node-editor/math/PowerEditor.js +1 -1
  149. package/examples/jsm/node-editor/math/TrigonometryEditor.js +1 -1
  150. package/examples/jsm/node-editor/procedural/CheckerEditor.js +1 -1
  151. package/examples/jsm/node-editor/utils/JoinEditor.js +1 -1
  152. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  153. package/examples/jsm/node-editor/utils/PreviewEditor.js +3 -3
  154. package/examples/jsm/node-editor/utils/SplitEditor.js +1 -1
  155. package/examples/jsm/node-editor/utils/TimerEditor.js +1 -1
  156. package/examples/jsm/nodes/Nodes.js +43 -13
  157. package/examples/jsm/nodes/accessors/CubeTextureNode.js +9 -5
  158. package/examples/jsm/nodes/accessors/NormalNode.js +4 -4
  159. package/examples/jsm/nodes/accessors/PositionNode.js +5 -5
  160. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  161. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  162. package/examples/jsm/nodes/core/CodeNode.js +3 -3
  163. package/examples/jsm/nodes/core/FunctionCallNode.js +20 -5
  164. package/examples/jsm/nodes/core/FunctionNode.js +2 -2
  165. package/examples/jsm/nodes/core/Node.js +14 -12
  166. package/examples/jsm/nodes/core/NodeBuilder.js +12 -12
  167. package/examples/jsm/nodes/core/NodeUtils.js +23 -1
  168. package/examples/jsm/nodes/core/{NodeVary.js → NodeVarying.js} +3 -3
  169. package/examples/jsm/nodes/core/{VaryNode.js → VaryingNode.js} +7 -7
  170. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +94 -0
  171. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  172. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -0
  173. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -7
  174. package/examples/jsm/nodes/lighting/LightingContextNode.js +4 -4
  175. package/examples/jsm/nodes/loaders/NodeLoader.js +2 -2
  176. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +31 -0
  177. package/examples/jsm/nodes/materials/Materials.js +13 -25
  178. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  179. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +4 -7
  180. package/examples/jsm/nodes/materials/NodeMaterial.js +2 -2
  181. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +28 -17
  182. package/examples/jsm/nodes/materialx/Disclaimer.md +199 -0
  183. package/examples/jsm/nodes/materialx/functions/lib/mx_hsv.js +56 -0
  184. package/examples/jsm/nodes/materialx/functions/lib/mx_noise.js +607 -0
  185. package/examples/jsm/nodes/math/MathNode.js +2 -12
  186. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +21 -6
  187. package/examples/jsm/nodes/procedural/CheckerNode.js +2 -2
  188. package/examples/jsm/nodes/shadernode/ShaderNode.js +5 -5
  189. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +8 -5
  190. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +20 -6
  191. package/examples/jsm/nodes/utils/ConvertNode.js +8 -3
  192. package/examples/jsm/nodes/utils/JoinNode.js +7 -7
  193. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +2 -1
  194. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  195. package/examples/jsm/nodes/utils/SplitNode.js +21 -5
  196. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  197. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  198. package/examples/jsm/objects/Reflector.js +12 -5
  199. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -5
  200. package/examples/jsm/objects/Refractor.js +12 -6
  201. package/examples/jsm/objects/ShadowMesh.js +8 -2
  202. package/examples/jsm/postprocessing/OutlinePass.js +5 -3
  203. package/examples/jsm/renderers/CSS2DRenderer.js +2 -2
  204. package/examples/jsm/renderers/CSS3DRenderer.js +2 -2
  205. package/examples/jsm/renderers/Projector.js +2 -24
  206. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +9 -5
  207. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +329 -218
  208. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +7 -3
  209. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +39 -3
  210. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +6 -0
  211. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +6 -0
  212. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +1 -1
  213. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +17 -19
  214. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +16 -14
  215. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +2 -2
  216. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +66 -81
  217. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +5 -3
  218. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +2 -2
  219. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  220. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +25 -30
  221. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  222. package/examples/jsm/shaders/LuminosityShader.js +1 -1
  223. package/examples/jsm/shaders/MMDToonShader.js +2 -2
  224. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  225. package/examples/jsm/utils/BufferGeometryUtils.js +2 -1
  226. package/examples/jsm/utils/GeometryUtils.js +17 -25
  227. package/examples/jsm/utils/PackedPhongMaterial.js +0 -1
  228. package/examples/jsm/utils/SceneUtils.js +1 -21
  229. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -1
  230. package/examples/jsm/webxr/VRButton.js +1 -7
  231. package/package.json +18 -14
  232. package/src/Three.Legacy.js +262 -36
  233. package/src/Three.js +3 -2
  234. package/src/animation/AnimationAction.js +6 -5
  235. package/src/animation/AnimationClip.js +1 -1
  236. package/src/animation/AnimationMixer.js +1 -1
  237. package/src/animation/AnimationUtils.js +204 -199
  238. package/src/animation/KeyframeTrack.js +1 -1
  239. package/src/animation/PropertyBinding.js +24 -5
  240. package/src/cameras/CubeCamera.js +0 -7
  241. package/src/constants.js +2 -4
  242. package/src/core/BufferAttribute.js +81 -111
  243. package/src/core/BufferGeometry.js +3 -41
  244. package/src/core/InstancedBufferAttribute.js +0 -10
  245. package/src/core/InterleavedBuffer.js +1 -1
  246. package/src/core/InterleavedBufferAttribute.js +56 -7
  247. package/src/core/Object3D.js +22 -5
  248. package/src/core/Uniform.js +0 -7
  249. package/src/core/UniformsGroup.js +92 -0
  250. package/src/extras/DataUtils.js +104 -88
  251. package/src/extras/core/Path.js +1 -0
  252. package/src/extras/core/ShapePath.js +1 -4
  253. package/src/extras/curves/CatmullRomCurve3.js +4 -2
  254. package/src/geometries/BoxGeometry.js +1 -1
  255. package/src/geometries/CapsuleGeometry.js +1 -1
  256. package/src/geometries/CircleGeometry.js +1 -1
  257. package/src/geometries/ConeGeometry.js +1 -1
  258. package/src/geometries/CylinderGeometry.js +2 -1
  259. package/src/geometries/DodecahedronGeometry.js +1 -1
  260. package/src/geometries/EdgesGeometry.js +5 -4
  261. package/src/geometries/ExtrudeGeometry.js +2 -11
  262. package/src/geometries/IcosahedronGeometry.js +1 -1
  263. package/src/geometries/LatheGeometry.js +2 -2
  264. package/src/geometries/OctahedronGeometry.js +1 -1
  265. package/src/geometries/PlaneGeometry.js +2 -1
  266. package/src/geometries/PolyhedronGeometry.js +1 -1
  267. package/src/geometries/RingGeometry.js +1 -1
  268. package/src/geometries/ShapeGeometry.js +2 -1
  269. package/src/geometries/SphereGeometry.js +2 -1
  270. package/src/geometries/TetrahedronGeometry.js +1 -1
  271. package/src/geometries/TorusGeometry.js +2 -1
  272. package/src/geometries/TorusKnotGeometry.js +2 -1
  273. package/src/geometries/TubeGeometry.js +2 -1
  274. package/src/geometries/WireframeGeometry.js +1 -0
  275. package/src/helpers/CameraHelper.js +97 -38
  276. package/src/helpers/DirectionalLightHelper.js +1 -0
  277. package/src/helpers/HemisphereLightHelper.js +1 -0
  278. package/src/helpers/PlaneHelper.js +6 -9
  279. package/src/helpers/PolarGridHelper.js +18 -14
  280. package/src/helpers/SpotLightHelper.js +1 -0
  281. package/src/lights/SpotLight.js +2 -0
  282. package/src/loaders/FileLoader.js +12 -1
  283. package/src/loaders/LoadingManager.js +1 -1
  284. package/src/loaders/MaterialLoader.js +49 -7
  285. package/src/loaders/ObjectLoader.js +4 -41
  286. package/src/materials/Material.js +1 -33
  287. package/src/materials/Materials.js +0 -27
  288. package/src/materials/MeshLambertMaterial.js +28 -1
  289. package/src/materials/ShaderMaterial.js +3 -7
  290. package/src/math/Color.js +3 -13
  291. package/src/math/MathUtils.js +1 -7
  292. package/src/math/Matrix3.js +1 -7
  293. package/src/math/Matrix4.js +3 -27
  294. package/src/math/Quaternion.js +1 -21
  295. package/src/math/Vector2.js +4 -24
  296. package/src/math/Vector3.js +7 -46
  297. package/src/math/Vector4.js +4 -24
  298. package/src/renderers/WebGLRenderer.js +84 -8
  299. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +12 -12
  300. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -5
  301. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -5
  302. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +24 -24
  303. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +1 -1
  304. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +1 -1
  305. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +2 -1
  306. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +113 -99
  307. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +34 -12
  308. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  309. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +30 -0
  310. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +3 -1
  311. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +13 -1
  312. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -4
  313. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +1 -1
  314. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +18 -7
  315. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +8 -3
  316. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +9 -6
  317. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  318. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +14 -10
  319. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +1 -1
  320. package/src/renderers/shaders/ShaderChunk.js +4 -2
  321. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +0 -1
  322. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +22 -50
  323. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  324. package/src/renderers/shaders/ShaderLib.js +31 -31
  325. package/src/renderers/shaders/UniformsLib.js +12 -11
  326. package/src/renderers/shaders/UniformsUtils.js +14 -0
  327. package/src/renderers/webgl/WebGLBackground.js +2 -2
  328. package/src/renderers/webgl/WebGLLights.js +37 -13
  329. package/src/renderers/webgl/WebGLMorphtargets.js +0 -20
  330. package/src/renderers/webgl/WebGLProgram.js +6 -11
  331. package/src/renderers/webgl/WebGLPrograms.js +30 -26
  332. package/src/renderers/webgl/WebGLRenderLists.js +5 -4
  333. package/src/renderers/webgl/WebGLRenderStates.js +5 -4
  334. package/src/renderers/webgl/WebGLShaderCache.js +9 -6
  335. package/src/renderers/webgl/WebGLShadowMap.js +10 -15
  336. package/src/renderers/webgl/WebGLState.js +47 -0
  337. package/src/renderers/webgl/WebGLUniforms.js +4 -4
  338. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  339. package/src/renderers/webgl/WebGLUtils.js +2 -0
  340. package/src/renderers/webvr/WebVRManager.js +42 -9
  341. package/src/renderers/webvr/WebVRUtils.js +1 -1
  342. package/src/renderers/webxr/WebXRController.js +45 -37
  343. package/src/renderers/webxr/WebXRManager.js +58 -33
  344. package/src/scenes/Scene.js +16 -3
  345. package/src/textures/Source.js +1 -1
  346. package/src/utils.js +1 -1
  347. package/examples/js/controls/experimental/CameraControls.js +0 -1048
  348. package/examples/js/loaders/KTX2Loader.js +0 -558
  349. package/examples/jsm/controls/experimental/CameraControls.js +0 -1248
  350. package/examples/jsm/nodes/accessors/ReflectNode.js +0 -70
  351. package/examples/jsm/package.json +0 -3
  352. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +0 -45
  353. package/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js +0 -122
@@ -1,9 +1,5 @@
1
- import NodeBuilder, { defaultShaderStages } from 'three-nodes/core/NodeBuilder.js';
2
- import NodeFrame from 'three-nodes/core/NodeFrame.js';
1
+ import { defaultShaderStages, NodeFrame, MathNode, GLSLNodeParser, NodeBuilder } from 'three/nodes';
3
2
  import SlotNode from './SlotNode.js';
4
- import GLSLNodeParser from 'three-nodes/parsers/GLSLNodeParser.js';
5
- import WebGLPhysicalContextNode from './WebGLPhysicalContextNode.js';
6
-
7
3
  import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib,
8
4
  LinearEncoding, RGBAFormat, UnsignedByteType, sRGBEncoding } from 'three';
9
5
 
@@ -14,7 +10,12 @@ const nodeShaderLib = {
14
10
  LineBasicNodeMaterial: ShaderLib.basic,
15
11
  MeshBasicNodeMaterial: ShaderLib.basic,
16
12
  PointsNodeMaterial: ShaderLib.points,
17
- MeshStandardNodeMaterial: ShaderLib.standard
13
+ MeshStandardNodeMaterial: ShaderLib.standard,
14
+ MeshPhysicalNodeMaterial: ShaderLib.physical
15
+ };
16
+
17
+ const glslMethods = {
18
+ [ MathNode.ATAN2 ]: 'atan'
18
19
  };
19
20
 
20
21
  function getIncludeSnippet( name ) {
@@ -38,16 +39,24 @@ class WebGLNodeBuilder extends NodeBuilder {
38
39
  this.shader = shader;
39
40
  this.slots = { vertex: [], fragment: [] };
40
41
 
42
+ this._parseShaderLib();
43
+ this._parseInclude( 'fragment', 'lights_physical_fragment', 'clearcoat_normal_fragment_begin', 'transmission_fragment' );
41
44
  this._parseObject();
42
45
 
46
+ this._sortSlotsToFlow();
47
+
48
+ }
49
+
50
+ getMethod( method ) {
51
+
52
+ return glslMethods[ method ] || method;
53
+
43
54
  }
44
55
 
45
56
  addSlot( shaderStage, slotNode ) {
46
57
 
47
58
  this.slots[ shaderStage ].push( slotNode );
48
59
 
49
- return this.addFlow( shaderStage, slotNode );
50
-
51
60
  }
52
61
 
53
62
  addFlowCode( code ) {
@@ -62,18 +71,12 @@ class WebGLNodeBuilder extends NodeBuilder {
62
71
 
63
72
  }
64
73
 
65
- _parseObject() {
74
+ _parseShaderLib() {
66
75
 
67
- const material = this.material;
68
- let type = material.type;
76
+ const type = this.material.type;
69
77
 
70
78
  // shader lib
71
79
 
72
- if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial';
73
- else if ( material.isMeshBasicNodeMaterial ) type = 'MeshBasicNodeMaterial';
74
- else if ( material.isPointsNodeMaterial ) type = 'PointsNodeMaterial';
75
- else if ( material.isLineBasicNodeMaterial ) type = 'LineBasicNodeMaterial';
76
-
77
80
  if ( nodeShaderLib[ type ] !== undefined ) {
78
81
 
79
82
  const shaderLib = nodeShaderLib[ type ];
@@ -85,9 +88,20 @@ class WebGLNodeBuilder extends NodeBuilder {
85
88
 
86
89
  }
87
90
 
88
- if ( material.isMeshStandardNodeMaterial !== true ) {
91
+ }
92
+
93
+ _parseObject() {
89
94
 
90
- this.replaceCode( 'fragment', getIncludeSnippet( 'tonemapping_fragment' ), '' );
95
+ const { material, renderer } = this;
96
+
97
+ if ( renderer.toneMappingNode?.isNode === true ) {
98
+
99
+ this.addSlot( 'fragment', new SlotNode( {
100
+ node: material.colorNode,
101
+ nodeType: 'vec4',
102
+ source: getIncludeSnippet( 'tonemapping_fragment' ),
103
+ target: ''
104
+ } ) );
91
105
 
92
106
  }
93
107
 
@@ -95,89 +109,308 @@ class WebGLNodeBuilder extends NodeBuilder {
95
109
 
96
110
  if ( material.colorNode && material.colorNode.isNode ) {
97
111
 
98
- this.addSlot( 'fragment', new SlotNode( material.colorNode, 'COLOR', 'vec4' ) );
112
+ this.addSlot( 'fragment', new SlotNode( {
113
+ node: material.colorNode,
114
+ nodeType: 'vec4',
115
+ source: getIncludeSnippet( 'color_fragment' ),
116
+ target: 'diffuseColor = %RESULT%;',
117
+ inclusionType: 'append'
118
+ } ) );
99
119
 
100
120
  }
101
121
 
102
122
  if ( material.opacityNode && material.opacityNode.isNode ) {
103
123
 
104
- this.addSlot( 'fragment', new SlotNode( material.opacityNode, 'OPACITY', 'float' ) );
124
+ this.addSlot( 'fragment', new SlotNode( {
125
+ node: material.opacityNode,
126
+ nodeType: 'float',
127
+ source: getIncludeSnippet( 'alphatest_fragment' ),
128
+ target: 'diffuseColor.a = %RESULT%;',
129
+ inclusionType: 'append'
130
+ } ) );
105
131
 
106
132
  }
107
133
 
108
134
  if ( material.normalNode && material.normalNode.isNode ) {
109
135
 
110
- this.addSlot( 'fragment', new SlotNode( material.normalNode, 'NORMAL', 'vec3' ) );
136
+ this.addSlot( 'fragment', new SlotNode( {
137
+ node: material.normalNode,
138
+ nodeType: 'vec3',
139
+ source: getIncludeSnippet( 'normal_fragment_begin' ),
140
+ target: 'normal = %RESULT%;',
141
+ inclusionType: 'append'
142
+ } ) );
111
143
 
112
144
  }
113
145
 
114
146
  if ( material.emissiveNode && material.emissiveNode.isNode ) {
115
147
 
116
- this.addSlot( 'fragment', new SlotNode( material.emissiveNode, 'EMISSIVE', 'vec3' ) );
148
+ this.addSlot( 'fragment', new SlotNode( {
149
+ node: material.emissiveNode,
150
+ nodeType: 'vec3',
151
+ source: getIncludeSnippet( 'emissivemap_fragment' ),
152
+ target: 'totalEmissiveRadiance = %RESULT%;',
153
+ inclusionType: 'append'
154
+ } ) );
117
155
 
118
156
  }
119
157
 
120
- if ( material.metalnessNode && material.metalnessNode.isNode ) {
158
+ if ( material.isMeshStandardNodeMaterial ) {
121
159
 
122
- this.addSlot( 'fragment', new SlotNode( material.metalnessNode, 'METALNESS', 'float' ) );
160
+ if ( material.metalnessNode && material.metalnessNode.isNode ) {
123
161
 
124
- }
162
+ this.addSlot( 'fragment', new SlotNode( {
163
+ node: material.metalnessNode,
164
+ nodeType: 'float',
165
+ source: getIncludeSnippet( 'metalnessmap_fragment' ),
166
+ target: 'metalnessFactor = %RESULT%;',
167
+ inclusionType: 'append'
168
+ } ) );
169
+
170
+ }
125
171
 
126
- if ( material.roughnessNode && material.roughnessNode.isNode ) {
172
+ if ( material.roughnessNode && material.roughnessNode.isNode ) {
127
173
 
128
- this.addSlot( 'fragment', new SlotNode( material.roughnessNode, 'ROUGHNESS', 'float' ) );
174
+ this.addSlot( 'fragment', new SlotNode( {
175
+ node: material.roughnessNode,
176
+ nodeType: 'float',
177
+ source: getIncludeSnippet( 'roughnessmap_fragment' ),
178
+ target: 'roughnessFactor = %RESULT%;',
179
+ inclusionType: 'append'
180
+ } ) );
129
181
 
130
- }
182
+ }
131
183
 
132
- if ( material.clearcoatNode && material.clearcoatNode.isNode ) {
184
+ if ( material.isMeshPhysicalNodeMaterial ) {
133
185
 
134
- this.addSlot( 'fragment', new SlotNode( material.clearcoatNode, 'CLEARCOAT', 'float' ) );
186
+ if ( material.clearcoatNode && material.clearcoatNode.isNode ) {
135
187
 
136
- }
188
+ this.addSlot( 'fragment', new SlotNode( {
189
+ node: material.clearcoatNode,
190
+ nodeType: 'float',
191
+ source: 'material.clearcoat = clearcoat;',
192
+ target: 'material.clearcoat = %RESULT%;'
193
+ } ) );
137
194
 
138
- if ( material.clearcoatRoughnessNode && material.clearcoatRoughnessNode.isNode ) {
195
+ if ( material.clearcoatRoughnessNode && material.clearcoatRoughnessNode.isNode ) {
139
196
 
140
- this.addSlot( 'fragment', new SlotNode( material.clearcoatRoughnessNode, 'CLEARCOAT_ROUGHNESS', 'float' ) );
197
+ this.addSlot( 'fragment', new SlotNode( {
198
+ node: material.clearcoatRoughnessNode,
199
+ nodeType: 'float',
200
+ source: 'material.clearcoatRoughness = clearcoatRoughness;',
201
+ target: 'material.clearcoatRoughness = %RESULT%;'
202
+ } ) );
141
203
 
142
- }
204
+ }
143
205
 
144
- if ( material.iridescenceNode && material.iridescenceNode.isNode ) {
206
+ if ( material.clearcoatNormalNode && material.clearcoatNormalNode.isNode ) {
145
207
 
146
- this.addSlot( 'fragment', new SlotNode( material.iridescenceNode, 'IRIDESCENCE', 'float' ) );
208
+ this.addSlot( 'fragment', new SlotNode( {
209
+ node: material.clearcoatNormalNode,
210
+ nodeType: 'vec3',
211
+ source: 'vec3 clearcoatNormal = geometryNormal;',
212
+ target: 'vec3 clearcoatNormal = %RESULT%;'
213
+ } ) );
147
214
 
148
- }
215
+ }
149
216
 
150
- if ( material.iridescenceIORNode && material.iridescenceIORNode.isNode ) {
217
+ material.defines.USE_CLEARCOAT = '';
151
218
 
152
- this.addSlot( 'fragment', new SlotNode( material.iridescenceIORNode, 'IRIDESCENCE_IOR', 'float' ) );
219
+ } else {
153
220
 
154
- }
221
+ delete material.defines.USE_CLEARCOAT;
155
222
 
156
- if ( material.iridescenceThicknessNode && material.iridescenceThicknessNode.isNode ) {
223
+ }
157
224
 
158
- this.addSlot( 'fragment', new SlotNode( material.iridescenceThicknessNode, 'IRIDESCENCE_THICKNESS', 'float' ) );
225
+ if ( material.sheenNode && material.sheenNode.isNode ) {
159
226
 
160
- }
227
+ this.addSlot( 'fragment', new SlotNode( {
228
+ node: material.sheenNode,
229
+ nodeType: 'vec3',
230
+ source: 'material.sheenColor = sheenColor;',
231
+ target: 'material.sheenColor = %RESULT%;'
232
+ } ) );
233
+
234
+ if ( material.sheenRoughnessNode && material.sheenRoughnessNode.isNode ) {
235
+
236
+ this.addSlot( 'fragment', new SlotNode( {
237
+ node: material.sheenRoughnessNode,
238
+ nodeType: 'float',
239
+ source: 'material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );',
240
+ target: 'material.sheenRoughness = clamp( %RESULT%, 0.07, 1.0 );'
241
+ } ) );
242
+
243
+ }
244
+
245
+ material.defines.USE_SHEEN = '';
246
+
247
+ } else {
248
+
249
+ delete material.defines.USE_SHEEN;
250
+
251
+ }
252
+
253
+ if ( material.iridescenceNode && material.iridescenceNode.isNode ) {
254
+
255
+ this.addSlot( 'fragment', new SlotNode( {
256
+ node: material.iridescenceNode,
257
+ nodeType: 'float',
258
+ source: 'material.iridescence = iridescence;',
259
+ target: 'material.iridescence = %RESULT%;'
260
+ } ) );
261
+
262
+ if ( material.iridescenceIORNode && material.iridescenceIORNode.isNode ) {
161
263
 
162
- if ( material.envNode && material.envNode.isNode ) {
264
+ this.addSlot( 'fragment', new SlotNode( {
265
+ node: material.iridescenceIORNode,
266
+ nodeType: 'float',
267
+ source: 'material.iridescenceIOR = iridescenceIOR;',
268
+ target: 'material.iridescenceIOR = %RESULT%;'
269
+ } ) );
163
270
 
164
- const envRadianceNode = new WebGLPhysicalContextNode( WebGLPhysicalContextNode.RADIANCE, material.envNode );
165
- const envIrradianceNode = new WebGLPhysicalContextNode( WebGLPhysicalContextNode.IRRADIANCE, material.envNode );
271
+ }
166
272
 
167
- this.addSlot( 'fragment', new SlotNode( envRadianceNode, 'RADIANCE', 'vec3' ) );
168
- this.addSlot( 'fragment', new SlotNode( envIrradianceNode, 'IRRADIANCE', 'vec3' ) );
273
+ if ( material.iridescenceThicknessNode && material.iridescenceThicknessNode.isNode ) {
274
+
275
+ this.addSlot( 'fragment', new SlotNode( {
276
+ node: material.iridescenceThicknessNode,
277
+ nodeType: 'float',
278
+ source: 'material.iridescenceThickness = iridescenceThicknessMaximum;',
279
+ target: 'material.iridescenceThickness = %RESULT%;'
280
+ } ) );
281
+
282
+ }
283
+
284
+ material.defines.USE_IRIDESCENCE = '';
285
+
286
+ } else {
287
+
288
+ delete material.defines.USE_IRIDESCENCE;
289
+
290
+ }
291
+
292
+ if ( material.iorNode && material.iorNode.isNode ) {
293
+
294
+ this.addSlot( 'fragment', new SlotNode( {
295
+ node: material.iorNode,
296
+ nodeType: 'float',
297
+ source: 'material.ior = ior;',
298
+ target: 'material.ior = %RESULT%;'
299
+ } ) );
300
+
301
+ }
302
+
303
+ if ( material.specularColorNode && material.specularColorNode.isNode ) {
304
+
305
+ this.addSlot( 'fragment', new SlotNode( {
306
+ node: material.specularColorNode,
307
+ nodeType: 'vec3',
308
+ source: 'vec3 specularColorFactor = specularColor;',
309
+ target: 'vec3 specularColorFactor = %RESULT%;'
310
+ } ) );
311
+
312
+ }
313
+
314
+ if ( material.specularIntensityNode && material.specularIntensityNode.isNode ) {
315
+
316
+ this.addSlot( 'fragment', new SlotNode( {
317
+ node: material.specularIntensityNode,
318
+ nodeType: 'float',
319
+ source: 'float specularIntensityFactor = specularIntensity;',
320
+ target: 'float specularIntensityFactor = %RESULT%;'
321
+ } ) );
322
+
323
+ }
324
+
325
+ if ( material.transmissionNode && material.transmissionNode.isNode ) {
326
+
327
+ this.addSlot( 'fragment', new SlotNode( {
328
+ node: material.transmissionNode,
329
+ nodeType: 'float',
330
+ source: 'material.transmission = transmission;',
331
+ target: 'material.transmission = %RESULT%;'
332
+ } ) );
333
+
334
+ if ( material.thicknessNode && material.thicknessNode.isNode ) {
335
+
336
+ this.addSlot( 'fragment', new SlotNode( {
337
+ node: material.thicknessNode,
338
+ nodeType: 'float',
339
+ source: 'material.thickness = thickness;',
340
+ target: 'material.thickness = %RESULT%;'
341
+ } ) );
342
+
343
+ }
344
+
345
+ if ( material.thicknessNode && material.thicknessNode.isNode ) {
346
+
347
+ this.addSlot( 'fragment', new SlotNode( {
348
+ node: material.thicknessNode,
349
+ nodeType: 'float',
350
+ source: 'material.thickness = thickness;',
351
+ target: 'material.thickness = %RESULT%;'
352
+ } ) );
353
+
354
+ }
355
+
356
+ if ( material.attenuationDistanceNode && material.attenuationDistanceNode.isNode ) {
357
+
358
+ this.addSlot( 'fragment', new SlotNode( {
359
+ node: material.attenuationDistanceNode,
360
+ nodeType: 'float',
361
+ source: 'material.attenuationDistance = attenuationDistance;',
362
+ target: 'material.attenuationDistance = %RESULT%;'
363
+ } ) );
364
+
365
+ }
366
+
367
+ if ( material.attenuationColorNode && material.attenuationColorNode.isNode ) {
368
+
369
+ this.addSlot( 'fragment', new SlotNode( {
370
+ node: material.attenuationColorNode,
371
+ nodeType: 'vec3',
372
+ source: 'material.attenuationColor = attenuationColor;',
373
+ target: 'material.attenuationColor = %RESULT%;'
374
+ } ) );
375
+
376
+ }
377
+
378
+ material.transmission = 1;
379
+ material.defines.USE_TRANSMISSION = '';
380
+
381
+ } else {
382
+
383
+ material.transmission = 0;
384
+ delete material.defines.USE_TRANSMISSION;
385
+
386
+ }
387
+
388
+ }
169
389
 
170
390
  }
171
391
 
392
+ //
393
+
172
394
  if ( material.positionNode && material.positionNode.isNode ) {
173
395
 
174
- this.addSlot( 'vertex', new SlotNode( material.positionNode, 'POSITION', 'vec3' ) );
396
+ this.addSlot( 'vertex', new SlotNode( {
397
+ node: material.positionNode,
398
+ nodeType: 'vec3',
399
+ source: getIncludeSnippet( 'begin_vertex' ),
400
+ target: 'transformed = %RESULT%;',
401
+ inclusionType: 'append'
402
+ } ) );
175
403
 
176
404
  }
177
405
 
178
406
  if ( material.sizeNode && material.sizeNode.isNode ) {
179
407
 
180
- this.addSlot( 'vertex', new SlotNode( material.sizeNode, 'SIZE', 'float' ) );
408
+ this.addSlot( 'vertex', new SlotNode( {
409
+ node: material.sizeNode,
410
+ nodeType: 'float',
411
+ source: 'gl_PointSize = size;',
412
+ target: 'gl_PointSize = %RESULT%;'
413
+ } ) );
181
414
 
182
415
  }
183
416
 
@@ -249,9 +482,7 @@ class WebGLNodeBuilder extends NodeBuilder {
249
482
 
250
483
  const attributes = this.attributes;
251
484
 
252
- for ( let index = 0; index < attributes.length; index ++ ) {
253
-
254
- const attribute = attributes[ index ];
485
+ for ( const attribute of attributes ) {
255
486
 
256
487
  // ignore common attributes to prevent redefinitions
257
488
  if ( attribute.name === 'uv' || attribute.name === 'position' || attribute.name === 'normal' )
@@ -267,17 +498,15 @@ class WebGLNodeBuilder extends NodeBuilder {
267
498
 
268
499
  }
269
500
 
270
- getVarys( /* shaderStage */ ) {
501
+ getVaryings( /* shaderStage */ ) {
271
502
 
272
503
  let snippet = '';
273
504
 
274
- const varys = this.varys;
275
-
276
- for ( let index = 0; index < varys.length; index ++ ) {
505
+ const varyings = this.varyings;
277
506
 
278
- const vary = varys[ index ];
507
+ for ( const varying of varyings ) {
279
508
 
280
- snippet += `varying ${vary.type} ${vary.name}; `;
509
+ snippet += `varying ${varying.type} ${varying.name}; `;
281
510
 
282
511
  }
283
512
 
@@ -285,7 +514,7 @@ class WebGLNodeBuilder extends NodeBuilder {
285
514
 
286
515
  }
287
516
 
288
- addCodeAfterSnippet( shaderStage, snippet, code ) {
517
+ addCodeAfterCode( shaderStage, snippet, code ) {
289
518
 
290
519
  const shaderProperty = getShaderStageProperty( shaderStage );
291
520
 
@@ -306,32 +535,11 @@ class WebGLNodeBuilder extends NodeBuilder {
306
535
 
307
536
  }
308
537
 
309
- addCodeAfterInclude( shaderStage, includeName, code ) {
310
-
311
- const includeSnippet = getIncludeSnippet( includeName );
312
-
313
- this.addCodeAfterSnippet( shaderStage, includeSnippet, code );
314
-
315
- }
316
-
317
538
  replaceCode( shaderStage, source, target ) {
318
539
 
319
540
  const shaderProperty = getShaderStageProperty( shaderStage );
320
541
 
321
- this.shader[ shaderProperty ] = this.shader[ shaderProperty ].replaceAll( source, target );
322
-
323
- }
324
-
325
- parseInclude( shaderStage, ...includes ) {
326
-
327
- for ( const name of includes ) {
328
-
329
- const includeSnippet = getIncludeSnippet( name );
330
- const code = ShaderChunk[ name ];
331
-
332
- this.replaceCode( shaderStage, includeSnippet, code );
333
-
334
- }
542
+ this[ shaderProperty ] = this[ shaderProperty ].replaceAll( source, target );
335
543
 
336
544
  }
337
545
 
@@ -363,7 +571,7 @@ class WebGLNodeBuilder extends NodeBuilder {
363
571
 
364
572
  const uniforms = this.getUniforms( shaderStage );
365
573
  const attributes = this.getAttributes( shaderStage );
366
- const varys = this.getVarys( shaderStage );
574
+ const varyings = this.getVaryings( shaderStage );
367
575
  const vars = this.getVars( shaderStage );
368
576
  const codes = this.getCodes( shaderStage );
369
577
 
@@ -376,8 +584,8 @@ ${uniforms}
376
584
  // attributes
377
585
  ${attributes}
378
586
 
379
- // varys
380
- ${varys}
587
+ // varyings
588
+ ${varyings}
381
589
 
382
590
  // vars
383
591
  ${vars}
@@ -413,174 +621,77 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]}
413
621
 
414
622
  }
415
623
 
416
- getSlot( shaderStage, name ) {
624
+ _parseInclude( shaderStage, ...includes ) {
417
625
 
418
- const slots = this.slots[ shaderStage ];
419
-
420
- for ( const node of slots ) {
626
+ for ( const name of includes ) {
421
627
 
422
- if ( node.name === name ) {
628
+ const includeSnippet = getIncludeSnippet( name );
629
+ const code = ShaderChunk[ name ];
423
630
 
424
- return this.getFlowData( node/*, shaderStage*/ );
631
+ const shaderProperty = getShaderStageProperty( shaderStage );
425
632
 
426
- }
633
+ this.shader[ shaderProperty ] = this.shader[ shaderProperty ].replaceAll( includeSnippet, code );
427
634
 
428
635
  }
429
636
 
430
637
  }
431
638
 
432
- _addSnippets() {
433
-
434
- this.parseInclude( 'fragment', 'lights_physical_fragment' );
435
-
436
- const colorSlot = this.getSlot( 'fragment', 'COLOR' );
437
- const opacityNode = this.getSlot( 'fragment', 'OPACITY' );
438
- const normalSlot = this.getSlot( 'fragment', 'NORMAL' );
439
- const emissiveNode = this.getSlot( 'fragment', 'EMISSIVE' );
440
- const roughnessNode = this.getSlot( 'fragment', 'ROUGHNESS' );
441
- const metalnessNode = this.getSlot( 'fragment', 'METALNESS' );
442
- const clearcoatNode = this.getSlot( 'fragment', 'CLEARCOAT' );
443
- const clearcoatRoughnessNode = this.getSlot( 'fragment', 'CLEARCOAT_ROUGHNESS' );
444
- const iridescenceNode = this.getSlot( 'fragment', 'IRIDESCENCE' );
445
- const iridescenceIORNode = this.getSlot( 'fragment', 'IRIDESCENCE_IOR' );
446
- const iridescenceThicknessNode = this.getSlot( 'fragment', 'IRIDESCENCE_THICKNESS' );
447
-
448
- const positionNode = this.getSlot( 'vertex', 'POSITION' );
449
- const sizeNode = this.getSlot( 'vertex', 'SIZE' );
450
-
451
- if ( colorSlot !== undefined ) {
452
-
453
- this.addCodeAfterInclude(
454
- 'fragment',
455
- 'color_fragment',
456
- `${colorSlot.code}\n\tdiffuseColor = ${colorSlot.result};`
457
- );
458
-
459
- }
460
-
461
- if ( opacityNode !== undefined ) {
462
-
463
- this.addCodeAfterInclude(
464
- 'fragment',
465
- 'alphatest_fragment',
466
- `${opacityNode.code}\n\tdiffuseColor.a = ${opacityNode.result};`
467
- );
468
-
469
- }
470
-
471
- if ( normalSlot !== undefined ) {
472
-
473
- this.addCodeAfterInclude(
474
- 'fragment',
475
- 'normal_fragment_begin',
476
- `${normalSlot.code}\n\tnormal = ${normalSlot.result};`
477
- );
639
+ _sortSlotsToFlow() {
478
640
 
479
- }
480
-
481
- if ( emissiveNode !== undefined ) {
482
-
483
- this.addCodeAfterInclude(
484
- 'fragment',
485
- 'emissivemap_fragment',
486
- `${emissiveNode.code}\n\ttotalEmissiveRadiance = ${emissiveNode.result};`
487
- );
488
-
489
- }
490
-
491
- if ( roughnessNode !== undefined ) {
492
-
493
- this.addCodeAfterInclude(
494
- 'fragment',
495
- 'roughnessmap_fragment',
496
- `${roughnessNode.code}\n\troughnessFactor = ${roughnessNode.result};`
497
- );
641
+ for ( const shaderStage of defaultShaderStages ) {
498
642
 
499
- }
643
+ const sourceCode = this.shader[ getShaderStageProperty( shaderStage ) ];
500
644
 
501
- if ( metalnessNode !== undefined ) {
645
+ const slots = this.slots[ shaderStage ].sort( ( slotA, slotB ) => {
502
646
 
503
- this.addCodeAfterInclude(
504
- 'fragment',
505
- 'metalnessmap_fragment',
506
- `${metalnessNode.code}\n\tmetalnessFactor = ${metalnessNode.result};`
507
- );
647
+ if ( sourceCode.indexOf( slotA.source ) == - 1 ) {
648
+ //console.log( slotA, sourceCode.indexOf( slotA.source ), sourceCode.indexOf( slotB.source ) );
649
+ //console.log(sourceCode);
650
+ }
508
651
 
509
- }
652
+ return sourceCode.indexOf( slotA.source ) > sourceCode.indexOf( slotB.source ) ? 1 : - 1;
510
653
 
511
- if ( clearcoatNode !== undefined ) {
654
+ } );
512
655
 
513
- this.addCodeAfterSnippet(
514
- 'fragment',
515
- 'material.clearcoatRoughness = clearcoatRoughness;',
516
- `${clearcoatNode.code}\n\tmaterial.clearcoat = ${clearcoatNode.result};`
517
- );
656
+ for ( const slotNode of slots ) {
518
657
 
519
- }
520
-
521
- if ( clearcoatRoughnessNode !== undefined ) {
658
+ this.addFlow( shaderStage, slotNode );
522
659
 
523
- this.addCodeAfterSnippet(
524
- 'fragment',
525
- 'material.clearcoatRoughness = clearcoatRoughness;',
526
- `${clearcoatRoughnessNode.code}\n\tmaterial.clearcoatRoughness = ${clearcoatRoughnessNode.result};`
527
- );
660
+ }
528
661
 
529
662
  }
530
663
 
531
- if ( iridescenceNode !== undefined ) {
664
+ }
532
665
 
533
- this.addCodeAfterSnippet(
534
- 'fragment',
535
- 'iridescence_fragment',
536
- `${iridescenceNode.code}\n\tmaterial.iridescence = ${iridescenceNode.result};`
537
- );
666
+ _addSnippets() {
538
667
 
539
- }
668
+ for ( const shaderStage of defaultShaderStages ) {
540
669
 
541
- if ( iridescenceIORNode !== undefined ) {
670
+ for ( const slotNode of this.slots[ shaderStage ] ) {
542
671
 
543
- this.addCodeAfterSnippet(
544
- 'fragment',
545
- 'iridescence_fragment',
546
- `${iridescenceIORNode.code}\n\tmaterial.iridescenceIOR = ${iridescenceIORNode.result};`
547
- );
672
+ const flowData = this.getFlowData( slotNode/*, shaderStage*/ );
548
673
 
549
- }
674
+ const inclusionType = slotNode.inclusionType;
675
+ const source = slotNode.source;
676
+ const target = flowData.code + '\n\t' + slotNode.target.replace( '%RESULT%', flowData.result );
550
677
 
551
- if ( iridescenceThicknessNode !== undefined ) {
678
+ if ( inclusionType === 'append' ) {
552
679
 
553
- this.addCodeAfterSnippet(
554
- 'fragment',
555
- 'iridescence_fragment',
556
- `${iridescenceThicknessNode.code}\n\tmaterial.iridescenceThickness = ${iridescenceThicknessNode.result};`
557
- );
680
+ this.addCodeAfterCode( shaderStage, source, target );
558
681
 
559
- }
682
+ } else if ( inclusionType === 'replace' ) {
560
683
 
561
- if ( positionNode !== undefined ) {
684
+ this.replaceCode( shaderStage, source, target );
562
685
 
563
- this.addCodeAfterInclude(
564
- 'vertex',
565
- 'begin_vertex',
566
- `${positionNode.code}\n\ttransformed = ${positionNode.result};`
567
- );
568
-
569
- }
570
-
571
- if ( sizeNode !== undefined ) {
686
+ } else {
572
687
 
573
- this.addCodeAfterSnippet(
574
- 'vertex',
575
- 'gl_PointSize = size;',
576
- `${sizeNode.code}\n\tgl_PointSize = ${sizeNode.result};`
577
- );
688
+ console.warn( `Inclusion type "${ inclusionType }" not compatible.` );
578
689
 
579
- }
690
+ }
580
691
 
581
- for ( const shaderStage of defaultShaderStages ) {
692
+ }
582
693
 
583
- this.addCodeAfterSnippet(
694
+ this.addCodeAfterCode(
584
695
  shaderStage,
585
696
  'main() {',
586
697
  this.flowCode[ shaderStage ]