Browse Source

WebGPURenderer: Tree-shaking 1/2 - WIP (#29187)

* tree shaking - WIP

* use TSLBase instead of ShaderNode

* cleanup

* PackingNode: Move to TSL approach

* update webgpu_mrt

* DiscardNode: Move to TSL approach

* HashNode: Move to TSL approach

* no references to discard() without chaining

* cleanup

* fix import

* TSL: add `grayscale`

* Update webgpu_backdrop.html

* updates

* Update misc_controls_fly.html

* update title

* Move `Node.increaseUsage()` -> `NodeBuilder.increaseUsage()`

* introduce `registerNodeClass`

* Update NodeLoader.js

* Separate Nodes class from TSL

* Update TextureBicubic.js

* Update webgpu_materials.html

* revision

* webgpu_loader_gltf_dispersion: fix warning

* webgpu_refraction: update initial angle

* webgpu_shadowmap_opacity: fix warning

* revision
sunag 1 năm trước cách đây
mục cha
commit
e13d012265
100 tập tin đã thay đổi với 853 bổ sung754 xóa
  1. 3 3
      examples/misc_controls_fly.html
  2. BIN
      examples/screenshots/webgpu_refraction.jpg
  3. 8 12
      examples/webgpu_backdrop.html
  4. 3 3
      examples/webgpu_backdrop_area.html
  5. 2 2
      examples/webgpu_backdrop_water.html
  6. 5 5
      examples/webgpu_compute_particles.html
  7. 6 6
      examples/webgpu_compute_particles_rain.html
  8. 7 7
      examples/webgpu_compute_particles_snow.html
  9. 3 3
      examples/webgpu_cubemap_adjustments.html
  10. 1 1
      examples/webgpu_loader_gltf_dispersion.html
  11. 8 6
      examples/webgpu_materials.html
  12. 2 2
      examples/webgpu_mrt_mask.html
  13. 2 2
      examples/webgpu_parallax_uv.html
  14. 2 2
      examples/webgpu_particles.html
  15. 3 3
      examples/webgpu_postprocessing.html
  16. 2 2
      examples/webgpu_postprocessing_3dlut.html
  17. 2 2
      examples/webgpu_postprocessing_afterimage.html
  18. 3 3
      examples/webgpu_postprocessing_anamorphic.html
  19. 2 2
      examples/webgpu_postprocessing_bloom_emissive.html
  20. 2 2
      examples/webgpu_postprocessing_bloom_selective.html
  21. 2 2
      examples/webgpu_postprocessing_difference.html
  22. 3 3
      examples/webgpu_postprocessing_dof.html
  23. 2 2
      examples/webgpu_postprocessing_fxaa.html
  24. 2 2
      examples/webgpu_postprocessing_sobel.html
  25. 3 3
      examples/webgpu_procedural_texture.html
  26. 2 2
      examples/webgpu_reflection.html
  27. 2 2
      examples/webgpu_refraction.html
  28. 2 2
      examples/webgpu_rtt.html
  29. 2 2
      examples/webgpu_sandbox.html
  30. 2 2
      examples/webgpu_shadowmap.html
  31. 1 1
      examples/webgpu_shadowmap_opacity.html
  32. 2 2
      examples/webgpu_skinning_instancing.html
  33. 2 2
      examples/webgpu_tsl_coffee_smoke.html
  34. 7 7
      examples/webgpu_tsl_compute_attractors_particles.html
  35. 2 2
      examples/webgpu_tsl_earth.html
  36. 2 2
      examples/webgpu_tsl_editor.html
  37. 3 6
      examples/webgpu_tsl_halftone.html
  38. 5 0
      src/Three.WebGPU.js
  39. 4 4
      src/loaders/nodes/NodeLoader.js
  40. 0 18
      src/loaders/nodes/NodeMaterialLoader.js
  41. 0 0
      src/loaders/nodes/NodeObjectLoader.js
  42. 13 16
      src/materials/nodes/InstancedPointsNodeMaterial.js
  43. 17 21
      src/materials/nodes/Line2NodeMaterial.js
  44. 2 4
      src/materials/nodes/LineBasicNodeMaterial.js
  45. 6 9
      src/materials/nodes/LineDashedNodeMaterial.js
  46. 9 10
      src/materials/nodes/MeshBasicNodeMaterial.js
  47. 4 6
      src/materials/nodes/MeshLambertNodeMaterial.js
  48. 7 9
      src/materials/nodes/MeshMatcapNodeMaterial.js
  49. 7 9
      src/materials/nodes/MeshNormalNodeMaterial.js
  50. 7 9
      src/materials/nodes/MeshPhongNodeMaterial.js
  51. 8 11
      src/materials/nodes/MeshPhysicalNodeMaterial.js
  52. 4 7
      src/materials/nodes/MeshSSSNodeMaterial.js
  53. 9 11
      src/materials/nodes/MeshStandardNodeMaterial.js
  54. 3 5
      src/materials/nodes/MeshToonNodeMaterial.js
  55. 24 83
      src/materials/nodes/NodeMaterial.js
  56. 1 1
      src/materials/nodes/NodeMaterials.js
  57. 2 4
      src/materials/nodes/PointsNodeMaterial.js
  58. 3 5
      src/materials/nodes/ShadowNodeMaterial.js
  59. 10 11
      src/materials/nodes/SpriteNodeMaterial.js
  60. 10 13
      src/materials/nodes/VolumeNodeMaterial.js
  61. 102 169
      src/nodes/Nodes.js
  62. 176 0
      src/nodes/TSL.js
  63. 5 5
      src/nodes/accessors/AccessorsUtils.js
  64. 7 7
      src/nodes/accessors/BatchNode.js
  65. 3 3
      src/nodes/accessors/Bitangent.js
  66. 5 5
      src/nodes/accessors/BufferAttributeNode.js
  67. 4 4
      src/nodes/accessors/BufferNode.js
  68. 0 0
      src/nodes/accessors/Camera.js
  69. 6 4
      src/nodes/accessors/ClippingNode.js
  70. 5 7
      src/nodes/accessors/CubeTextureNode.js
  71. 6 6
      src/nodes/accessors/InstanceNode.js
  72. 4 4
      src/nodes/accessors/InstancedPointsMaterialNode.js
  73. 10 8
      src/nodes/accessors/MaterialNode.js
  74. 4 4
      src/nodes/accessors/MaterialReferenceNode.js
  75. 5 5
      src/nodes/accessors/ModelNode.js
  76. 6 7
      src/nodes/accessors/ModelViewProjectionNode.js
  77. 7 7
      src/nodes/accessors/MorphNode.js
  78. 4 5
      src/nodes/accessors/Normal.js
  79. 4 4
      src/nodes/accessors/Object3DNode.js
  80. 4 4
      src/nodes/accessors/PointUVNode.js
  81. 10 0
      src/nodes/accessors/Position.js
  82. 0 11
      src/nodes/accessors/PositionNode.js
  83. 143 0
      src/nodes/accessors/ReferenceBaseNode.js
  84. 5 4
      src/nodes/accessors/ReferenceNode.js
  85. 3 3
      src/nodes/accessors/ReflectVector.js
  86. 6 6
      src/nodes/accessors/RendererReferenceNode.js
  87. 4 5
      src/nodes/accessors/SceneNode.js
  88. 7 7
      src/nodes/accessors/SkinningNode.js
  89. 4 5
      src/nodes/accessors/StorageBufferNode.js
  90. 4 4
      src/nodes/accessors/StorageTextureNode.js
  91. 4 5
      src/nodes/accessors/Tangent.js
  92. 4 4
      src/nodes/accessors/Texture3DNode.js
  93. 3 32
      src/nodes/accessors/TextureBicubic.js
  94. 5 8
      src/nodes/accessors/TextureNode.js
  95. 4 6
      src/nodes/accessors/TextureSizeNode.js
  96. 0 0
      src/nodes/accessors/UV.js
  97. 4 4
      src/nodes/accessors/UniformArrayNode.js
  98. 4 4
      src/nodes/accessors/UserDataNode.js
  99. 6 6
      src/nodes/accessors/VelocityNode.js
  100. 4 4
      src/nodes/accessors/VertexColorNode.js

+ 3 - 3
examples/misc_controls_fly.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<title>three.js webgl - fly controls - earth</title>
+		<title>three.js webgpu - fly controls - earth</title>
 		<meta charset="utf-8">
 		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
 		<link type="text/css" rel="stylesheet" href="main.css">
@@ -40,7 +40,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass } from 'three/tsl';
+			import { pass, film } from 'three/tsl';
 
 			import Stats from 'three/addons/libs/stats.module.js';
 			import { FlyControls } from 'three/addons/controls/FlyControls.js';
@@ -221,7 +221,7 @@
 				const scenePass = pass( scene, camera );
 				const scenePassColor = scenePass.getTextureNode();
 
-				postProcessing.outputNode = scenePassColor.film();
+				postProcessing.outputNode = film( scenePassColor );
 
 			}
 

BIN
examples/screenshots/webgpu_refraction.jpg


+ 8 - 12
examples/webgpu_backdrop.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { float, vec3, color, viewportSharedTexture, viewportSafeUV, viewportUV, checker, uv, timerLocal, oscSine, output } from 'three/tsl';
+			import { float, vec3, color, viewportSharedTexture, hue, overlay, posterize, grayscale, saturation, viewportSafeUV, viewportUV, checker, uv, timerLocal, oscSine, output } from 'three/tsl';
 
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 
@@ -48,7 +48,7 @@
 
 				clock = new THREE.Clock();
 
-				//lights
+				// lights
 
 				const light = new THREE.SpotLight( 0xffffff, 1 );
 				light.power = 2000;
@@ -62,11 +62,7 @@
 					mixer = new THREE.AnimationMixer( object );
 
 					const material = object.children[ 0 ].children[ 0 ].material;
-
-					// output material effect ( better using hsv )
-					// ignore output.sRGBToLinear().linearTosRGB() for now
-
-					material.outputNode = oscSine( timerLocal( .1 ) ).mix( output, output.add( .1 ).posterize( 4 ).mul( 2 ) );
+					material.outputNode = oscSine( timerLocal( .1 ) ).mix( output, posterize( output.add( .1 ), 4 ).mul( 2 ) );
 
 					const action = mixer.clipAction( gltf.animations[ 0 ] );
 					action.play();
@@ -106,16 +102,16 @@
 
 				}
 
-				addBackdropSphere( viewportSharedTexture().bgr.hue( oscSine().mul( Math.PI ) ) );
+				addBackdropSphere( hue( viewportSharedTexture().bgr, oscSine().mul( Math.PI ) ) );
 				addBackdropSphere( viewportSharedTexture().rgb.oneMinus() );
-				addBackdropSphere( viewportSharedTexture().rgb.saturation( 0 ) );
-				addBackdropSphere( viewportSharedTexture().rgb.saturation( 10 ), oscSine() );
-				addBackdropSphere( viewportSharedTexture().rgb.overlay( checker( uv().mul( 10 ) ) ) );
+				addBackdropSphere( grayscale( viewportSharedTexture().rgb ) );
+				addBackdropSphere( saturation( viewportSharedTexture().rgb, 10 ), oscSine() );
+				addBackdropSphere( overlay( viewportSharedTexture().rgb, checker( uv().mul( 10 ) ) ) );
 				addBackdropSphere( viewportSharedTexture( viewportSafeUV( viewportUV.mul( 40 ).floor().div( 40 ) ) ) );
 				addBackdropSphere( viewportSharedTexture( viewportSafeUV( viewportUV.mul( 80 ).floor().div( 80 ) ) ).add( color( 0x0033ff ) ) );
 				addBackdropSphere( vec3( 0, 0, viewportSharedTexture().b ) );
 
-				//renderer
+				// renderer
 
 				renderer = new THREE.WebGPURenderer( { antialias: false } );
 				renderer.setPixelRatio( window.devicePixelRatio );

+ 3 - 3
examples/webgpu_backdrop_area.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { color, linearDepth, viewportLinearDepth, viewportSharedTexture, viewportMipTexture, viewportUV, checker, uv, modelScale } from 'three/tsl';
+			import { color, linearDepth, viewportLinearDepth, viewportSharedTexture, textureBicubic, viewportMipTexture, viewportUV, checker, uv, modelScale } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -79,7 +79,7 @@
 				const depthDistance = viewportLinearDepth.distance( linearDepth() );
 
 				const depthAlphaNode = depthDistance.oneMinus().smoothstep( .90, 2 ).mul( 10 ).saturate();
-				const depthBlurred = viewportMipTexture().bicubic( depthDistance.smoothstep( 0, .6 ).mul( 40 * 5 ).clamp( 0, 5 ) );
+				const depthBlurred = textureBicubic( viewportMipTexture(), depthDistance.smoothstep( 0, .6 ).mul( 40 * 5 ).clamp( 0, 5 ) );
 
 				const blurredBlur = new THREE.MeshBasicNodeMaterial();
 				blurredBlur.backdropNode = depthBlurred.add( depthAlphaNode.mix( color( 0x0066ff ), 0 ) );
@@ -99,7 +99,7 @@
 				depthMaterial.side = THREE.DoubleSide;
 
 				const bicubicMaterial = new THREE.MeshBasicNodeMaterial();
-				bicubicMaterial.backdropNode = viewportMipTexture().bicubic( 5 ); // @TODO: Move to alpha value [ 0, 1 ]
+				bicubicMaterial.backdropNode = textureBicubic( viewportMipTexture(), 5 ); // @TODO: Move to alpha value [ 0, 1 ]
 				bicubicMaterial.backdropAlphaNode = checker( uv().mul( 3 ).mul( modelScale.xy ) );
 				bicubicMaterial.opacityNode = bicubicMaterial.backdropAlphaNode;
 				bicubicMaterial.transparent = true;

+ 2 - 2
examples/webgpu_backdrop_water.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { color, vec2, pass, linearDepth, normalWorld, triplanarTexture, texture, objectPosition, viewportUV, viewportLinearDepth, viewportDepthTexture, viewportSharedTexture, mx_worley_noise_float, positionWorld, timerLocal } from 'three/tsl';
+			import { color, vec2, pass, linearDepth, normalWorld, gaussianBlur, triplanarTexture, texture, objectPosition, viewportUV, viewportLinearDepth, viewportDepthTexture, viewportSharedTexture, mx_worley_noise_float, positionWorld, timerLocal } from 'three/tsl';
 
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 
@@ -223,7 +223,7 @@
 
 				const waterMask = objectPosition( camera ).y.greaterThan( 0 );
 
-				const scenePassColorBlurred = scenePassColor.gaussianBlur();
+				const scenePassColorBlurred = gaussianBlur( scenePassColor );
 				scenePassColorBlurred.directionNode = waterMask.select( scenePassDepth, scenePass.getLinearDepthNode().mul( 5 ) );
 
 				const vignet = viewportUV.distance( .5 ).mul( 1.35 ).clamp().oneMinus();

+ 5 - 5
examples/webgpu_compute_particles.html

@@ -37,7 +37,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { Fn, uniform, texture, instanceIndex, float, vec3, storage, If } from 'three/tsl';
+			import { Fn, uniform, texture, instanceIndex, float, hash, vec3, storage, If } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import Stats from 'three/addons/libs/stats.module.js';
@@ -90,9 +90,9 @@
 					const position = positionBuffer.element( instanceIndex );
 					const color = colorBuffer.element( instanceIndex );
 
-					const randX = instanceIndex.hash();
-					const randY = instanceIndex.add( 2 ).hash();
-					const randZ = instanceIndex.add( 3 ).hash();
+					const randX = hash( instanceIndex );
+					const randY = hash( instanceIndex.add( 2 ) );
+					const randZ = hash( instanceIndex.add( 3 ) );
 
 					position.x = randX.mul( 100 ).add( - 50 );
 					position.y = 0; // randY.mul( 10 );
@@ -192,7 +192,7 @@
 					const distArea = float( 6 ).sub( dist ).max( 0 );
 
 					const power = distArea.mul( .01 );
-					const relativePower = power.mul( instanceIndex.hash().mul( .5 ).add( .5 ) );
+					const relativePower = power.mul( hash( instanceIndex ).mul( .5 ).add( .5 ) );
 
 					velocity.assign( velocity.add( direction.mul( relativePower ) ) );
 

+ 6 - 6
examples/webgpu_compute_particles_rain.html

@@ -24,7 +24,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { Fn, texture, uv, uint, positionWorld, billboarding, timerLocal, timerDelta, vec2, instanceIndex, positionGeometry, storage, If } from 'three/tsl';
+			import { Fn, texture, uv, uint, positionWorld, billboarding, timerLocal, hash, timerDelta, vec2, instanceIndex, positionGeometry, storage, If } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 
@@ -112,9 +112,9 @@
 					const velocity = velocityBuffer.element( instanceIndex );
 					const rippleTime = rippleTimeBuffer.element( instanceIndex );
 
-					const randX = instanceIndex.hash();
-					const randY = instanceIndex.add( randUint() ).hash();
-					const randZ = instanceIndex.add( randUint() ).hash();
+					const randX = hash( instanceIndex );
+					const randY = hash( instanceIndex.add( randUint() ) );
+					const randZ = hash( instanceIndex.add( randUint() ) );
 
 					position.x = randX.mul( 100 ).add( - 50 );
 					position.y = randY.mul( 25 );
@@ -166,8 +166,8 @@
 
 						// next drops will not fall in the same place
 
-						position.x = instanceIndex.add( timer ).hash().mul( 100 ).add( - 50 );
-						position.z = instanceIndex.add( timer.add( randUint() ) ).hash().mul( 100 ).add( - 50 );
+						position.x = hash( instanceIndex.add( timer ) ).mul( 100 ).add( - 50 );
+						position.z = hash( instanceIndex.add( timer.add( randUint() ) ) ).mul( 100 ).add( - 50 );
 
 					} );
 

+ 7 - 7
examples/webgpu_compute_particles_snow.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { Fn, texture, vec3, pass, color, uint, viewportUV, positionWorld, positionLocal, timerLocal, vec2, instanceIndex, storage, If } from 'three/tsl';
+			import { Fn, texture, vec3, pass, color, uint, viewportUV, positionWorld, positionLocal, timerLocal, vec2, hash, gaussianBlur, instanceIndex, storage, If } from 'three/tsl';
 
 			import { TeapotGeometry } from 'three/addons/geometries/TeapotGeometry.js';
 
@@ -111,15 +111,15 @@
 					const scale = scaleBuffer.element( instanceIndex );
 					const particleData = dataBuffer.element( instanceIndex );
 
-					const randX = instanceIndex.hash();
-					const randY = instanceIndex.add( randUint() ).hash();
-					const randZ = instanceIndex.add( randUint() ).hash();
+					const randX = hash( instanceIndex );
+					const randY = hash( instanceIndex.add( randUint() ) );
+					const randZ = hash( instanceIndex.add( randUint() ) );
 
 					position.x = randX.mul( 100 ).add( - 50 );
 					position.y = randY.mul( 500 ).add( 3 );
 					position.z = randZ.mul( 100 ).add( - 50 );
 
-					scale.xyz = instanceIndex.add( Math.random() ).hash().mul( .8 ).add( .2 );
+					scale.xyz = hash( instanceIndex.add( Math.random() ) ).mul( .8 ).add( .2 );
 
 					staticPositionBuffer.element( instanceIndex ).assign( vec3( 1000, 10000, 1000 ) );
 
@@ -298,10 +298,10 @@
 				const vignet = viewportUV.distance( .5 ).mul( 1.35 ).clamp().oneMinus();
 
 				const teapotTreePass = pass( teapotTree, camera ).getTextureNode();
-				const teapotTreePassBlurred = teapotTreePass.gaussianBlur( vec2( 1 ), 3 );
+				const teapotTreePassBlurred = gaussianBlur( teapotTreePass, vec2( 1 ), 3 );
 				teapotTreePassBlurred.resolution = new THREE.Vector2( .2, .2 );
 
-				const scenePassColorBlurred = scenePassColor.gaussianBlur();
+				const scenePassColorBlurred = gaussianBlur( scenePassColor );
 				scenePassColorBlurred.resolution = new THREE.Vector2( .5, .5 );
 				scenePassColorBlurred.directionNode = vec2( 1 );
 

+ 3 - 3
examples/webgpu_cubemap_adjustments.html

@@ -27,7 +27,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { uniform, mix, pmremTexture, reference, positionLocal, positionWorld, normalWorld, positionWorldDirection, reflectVector } from 'three/tsl';
+			import { uniform, mix, pmremTexture, reference, positionLocal, hue, saturation, positionWorld, normalWorld, positionWorldDirection, reflectVector } from 'three/tsl';
 
 			import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js';
 
@@ -99,8 +99,8 @@
 					const proceduralEnv = mix( mixCubeMaps, normalWorld, proceduralNode );
 
 					const intensityFilter = proceduralEnv.mul( intensityNode );
-					const hueFilter = intensityFilter.hue( hueNode );
-					return hueFilter.saturation( saturationNode );
+					const hueFilter = hue( intensityFilter, hueNode );
+					return saturation( hueFilter, saturationNode );
 
 				};
 

+ 1 - 1
examples/webgpu_loader_gltf_dispersion.html

@@ -33,7 +33,7 @@
 
 			let camera, scene, renderer;
 
-			init().then( render );
+			init();
 
 			async function init() {
 

+ 8 - 6
examples/webgpu_materials.html

@@ -25,7 +25,9 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { Fn, wgslFn, positionLocal, positionWorld, normalLocal, normalWorld, normalView, color, texture, uv, float, vec2, vec3, vec4, oscSine, triplanarTexture, viewportUV, js, string, global, Loop, cameraProjectionMatrix } from 'three/tsl';
+			import * as TSL from 'three/tsl';
+
+			import { Fn, wgslFn, positionLocal, scriptable, positionWorld, normalLocal, normalWorld, normalView, color, texture, uv, float, vec2, vec3, vec4, oscSine, triplanarTexture, viewportUV, js, string, global, Loop, cameraProjectionMatrix } from 'three/tsl';
 
 			import { TeapotGeometry } from 'three/addons/geometries/TeapotGeometry.js';
 
@@ -239,9 +241,9 @@
 				// Scriptable
 
 				global.set( 'THREE', THREE );
-				global.set( 'TSL', THREE );
+				global.set( 'TSL', TSL );
 
-				const asyncNode = js( `
+				const asyncNode = scriptable( js( `
 
 					layout = {
 						outputType: 'node'
@@ -273,9 +275,9 @@
 
 					}
 
-				` ).scriptable();
+				` ) );
 
-				const scriptableNode = js( `
+				const scriptableNode = scriptable( js( `
 
 					layout = {
 						outputType: 'node',
@@ -325,7 +327,7 @@
 
 					output = { helloWorld };
 
-				` ).scriptable();
+				` ) );
 
 				scriptableNode.setParameter( 'source', texture( uvTexture ).xyz );
 				scriptableNode.setParameter( 'contrast', asyncNode );

+ 2 - 2
examples/webgpu_mrt_mask.html

@@ -26,7 +26,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { color, viewportUV, mrt, output, pass, vec4 } from 'three/tsl';
+			import { color, viewportUV, mrt, output, gaussianBlur, pass, vec4 } from 'three/tsl';
 
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 
@@ -130,7 +130,7 @@
 
 				postProcessing = new THREE.PostProcessing( renderer );
 				postProcessing.outputColorTransform = false;
-				postProcessing.outputNode = colorPass.add( maskPass.gaussianBlur( 1, 10 ).mul( .3 ) ).renderOutput();
+				postProcessing.outputNode = colorPass.add( gaussianBlur( maskPass, 1, 10 ).mul( .3 ) ).renderOutput();
 
 				// controls
 

+ 2 - 2
examples/webgpu_parallax_uv.html

@@ -27,7 +27,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { texture, parallaxUV, uv } from 'three/tsl';
+			import { texture, parallaxUV, overlay, uv } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 
@@ -89,7 +89,7 @@
 				const parallaxUVOffset = parallaxUV( uv(), offsetUV );
 				const parallaxResult = texture( bottomTexture, parallaxUVOffset );
 
-				const iceNode = texture( topTexture ).overlay( parallaxResult );
+				const iceNode = overlay( texture( topTexture ), parallaxResult );
 
 				// material
 

+ 2 - 2
examples/webgpu_particles.html

@@ -24,7 +24,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { range, texture, mix, uv, color, positionLocal, timerLocal } from 'three/tsl';
+			import { range, texture, mix, uv, color, rotateUV, positionLocal, timerLocal } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -65,7 +65,7 @@
 
 				const fakeLightEffect = positionLocal.y.oneMinus().max( 0.2 );
 
-				const textureNode = texture( map, uv().rotateUV( timer.mul( rotateRange ) ) );
+				const textureNode = texture( map, rotateUV( uv(), timer.mul( rotateRange ) ) );
 
 				const opacityNode = textureNode.a.mul( life.oneMinus() );
 

+ 3 - 3
examples/webgpu_postprocessing.html

@@ -20,7 +20,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass } from 'three/tsl';
+			import { pass, dotScreen, rgbShift } from 'three/tsl';
 
 			let camera, renderer, postProcessing;
 			let object;
@@ -73,10 +73,10 @@
 				const scenePass = pass( scene, camera );
 				const scenePassColor = scenePass.getTextureNode();
 
-				const dotScreenPass = scenePassColor.dotScreen();
+				const dotScreenPass = dotScreen( scenePassColor );
 				dotScreenPass.scale.value = 0.3;
 
-				const rgbShiftPass = dotScreenPass.rgbShift();
+				const rgbShiftPass = rgbShift( dotScreenPass );
 				rgbShiftPass.amount.value = 0.001;
 
 				postProcessing.outputNode = rgbShiftPass;

+ 2 - 2
examples/webgpu_postprocessing_3dlut.html

@@ -29,7 +29,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, texture3D, uniform, renderOutput } from 'three/tsl';
+			import { pass, texture3D, uniform, lut3D, renderOutput } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
@@ -145,7 +145,7 @@
 				const outputPass = renderOutput( scenePass );
 
 				const lut = lutMap[ params.lut ];
-				lutPass = outputPass.lut3D( texture3D( lut.texture3D ), lut.texture3D.image.width, uniform( 1 ) );
+				lutPass = lut3D( outputPass, texture3D( lut.texture3D ), lut.texture3D.image.width, uniform( 1 ) );
 
 				postProcessing.outputNode = lutPass;
 

+ 2 - 2
examples/webgpu_postprocessing_afterimage.html

@@ -20,7 +20,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass } from 'three/tsl';
+			import { pass, afterImage } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -63,7 +63,7 @@
 				const scenePassColor = scenePass.getTextureNode();
 
 				combinedPass = scenePassColor;
-				combinedPass = combinedPass.afterImage( params.damp );
+				combinedPass = afterImage( combinedPass, params.damp );
 
 				postProcessing.outputNode = combinedPass;
 

+ 3 - 3
examples/webgpu_postprocessing_anamorphic.html

@@ -27,7 +27,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, cubeTexture, viewportUV, uniform } from 'three/tsl';
+			import { pass, cubeTexture, viewportUV, grayscale, uniform, anamorphic } from 'three/tsl';
 
 			import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js';
 
@@ -58,7 +58,7 @@
 					.loadCubemapAsync( rgbmUrls );
 
 				scene.environment = cube1Texture;
-				scene.backgroundNode = cubeTexture( cube1Texture ).mul( viewportUV.distance( .5 ).oneMinus().remapClamp( .1, 4 ) ).saturation( 0 );
+				scene.backgroundNode = grayscale( cubeTexture( cube1Texture ).mul( viewportUV.distance( .5 ).oneMinus().remapClamp( .1, 4 ) ) );
 
 				const loader = new GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' );
 				loader.load( 'DamagedHelmet.gltf', function ( gltf ) {
@@ -89,7 +89,7 @@
 				const intensity = uniform( 1 );
 				const samples = 64;
 
-				const anamorphicPass = scenePass.getTextureNode().anamorphic( threshold, scaleNode, samples );
+				const anamorphicPass = anamorphic( scenePass.getTextureNode(), threshold, scaleNode, samples );
 				anamorphicPass.resolution = new THREE.Vector2( .2, .2 ); // 1 = full resolution
 
 				postProcessing = new THREE.PostProcessing( renderer );

+ 2 - 2
examples/webgpu_postprocessing_bloom_emissive.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, mrt, output, emissive } from 'three/tsl';
+			import { pass, mrt, output, bloom, emissive } from 'three/tsl';
 
 			import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
 
@@ -91,7 +91,7 @@
 				const outputPass = scenePass.getTextureNode();
 				const emissivePass = scenePass.getTextureNode( 'emissive' );
 
-				const bloomPass = emissivePass.bloom( 2.5, .5 );
+				const bloomPass = bloom( emissivePass, 2.5, .5 );
 
 				postProcessing = new THREE.PostProcessing( renderer );
 				postProcessing.outputNode = outputPass.add( bloomPass );

+ 2 - 2
examples/webgpu_postprocessing_bloom_selective.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, mrt, output, float, uniform } from 'three/tsl';
+			import { pass, mrt, output, float, bloom, uniform } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 
@@ -83,7 +83,7 @@
 			const outputPass = scenePass.getTextureNode();
 			const bloomIntensityPass = scenePass.getTextureNode( 'bloomIntensity' );
 
-			const bloomPass = outputPass.mul( bloomIntensityPass ).bloom();
+			const bloomPass = bloom( outputPass.mul( bloomIntensityPass ) );
 
 			const postProcessing = new THREE.PostProcessing( renderer );
 			postProcessing.outputColorTransform = false;

+ 2 - 2
examples/webgpu_postprocessing_difference.html

@@ -26,7 +26,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, luminance } from 'three/tsl';
+			import { pass, luminance, saturation } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { Timer } from 'three/addons/misc/Timer.js';
@@ -84,7 +84,7 @@
 
 				const saturationAmount = luminance( frameDiff ).mul( 1000 ).clamp( 0, 3 );
 
-				postProcessing.outputNode = currentTexture.saturation( saturationAmount );
+				postProcessing.outputNode = saturation( currentTexture, saturationAmount );
 
 				//
 

+ 3 - 3
examples/webgpu_postprocessing_dof.html

@@ -20,7 +20,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { cubeTexture, positionWorld, oscSine, timerGlobal, pass, uniform } from 'three/tsl';
+			import { cubeTexture, positionWorld, oscSine, timerGlobal, pass, dof, uniform } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -117,7 +117,7 @@
 				const scenePassColor = scenePass.getTextureNode();
 				const scenePassViewZ = scenePass.getViewZNode();
 
-				const dofPass = scenePassColor.dof( scenePassViewZ, effectController.focus, effectController.aperture.mul( 0.00001 ), effectController.maxblur );
+				const dofPass = dof( scenePassColor, scenePassViewZ, effectController.focus, effectController.aperture.mul( 0.00001 ), effectController.maxblur );
 
 				postProcessing.outputNode = dofPass;
 
@@ -169,7 +169,7 @@
 			function animate() {
 
 				render();
-				stats.update();
+				//stats.update();
 
 			}
 

+ 2 - 2
examples/webgpu_postprocessing_fxaa.html

@@ -22,7 +22,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, renderOutput } from 'three/tsl';
+			import { pass, fxaa, renderOutput } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -105,7 +105,7 @@
 
 				// FXAA must be computed in sRGB color space (so after tone mapping and color space conversion)
 
-				const fxaaPass = outputPass.fxaa();
+				const fxaaPass = fxaa( outputPass );
 				postProcessing.outputNode = fxaaPass;
 
 				//

+ 2 - 2
examples/webgpu_postprocessing_sobel.html

@@ -20,7 +20,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass } from 'three/tsl';
+			import { pass, sobel } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 
@@ -82,7 +82,7 @@
 				const scenePass = pass( scene, camera );
 				const scenePassColor = scenePass.getTextureNode();
 
-				postProcessing.outputNode = scenePassColor.sobel();
+				postProcessing.outputNode = sobel( scenePassColor );
 
 				//
 

+ 3 - 3
examples/webgpu_procedural_texture.html

@@ -24,7 +24,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { checker, uv, uniform } from 'three/tsl';
+			import { checker, uv, uniform, gaussianBlur, convertToTexture } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 
@@ -47,9 +47,9 @@
 				const blurAmount = uniform( .5 );
 
 				const procedural = checker( uv().mul( uvScale ) );
-				const proceduralToTexture = procedural.toTexture( 512, 512 ); // ( width, height ) <- texture size
+				const proceduralToTexture = convertToTexture( procedural, 512, 512 ); // ( node, width, height )
 
-				const colorNode = proceduralToTexture.gaussianBlur( blurAmount, 10 );
+				const colorNode = gaussianBlur( proceduralToTexture, blurAmount, 10 );
 
 				// extra
 

+ 2 - 2
examples/webgpu_reflection.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { color, pass, reflector, normalWorld, texture, uv, viewportUV } from 'three/tsl';
+			import { color, pass, reflector, normalWorld, texture, uv, viewportUV, gaussianBlur } from 'three/tsl';
 
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 
@@ -148,7 +148,7 @@
 				const scenePassColor = scenePass.getTextureNode();
 				const scenePassDepth = scenePass.getLinearDepthNode().remapClamp( .3, .5 );
 
-				const scenePassColorBlurred = scenePassColor.gaussianBlur();
+				const scenePassColorBlurred = gaussianBlur( scenePassColor );
 				scenePassColorBlurred.directionNode = scenePassDepth;
 
 				const vignet = viewportUV.distance( .5 ).mul( 1.35 ).clamp().oneMinus();

+ 2 - 2
examples/webgpu_refraction.html

@@ -44,7 +44,7 @@
 
 				// camera
 				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 500 );
-				camera.position.set( 0, 75, 160 );
+				camera.position.set( 0, 50, 160 );
 
 				//
 
@@ -135,7 +135,7 @@
 				// controls
 
 				cameraControls = new OrbitControls( camera, renderer.domElement );
-				cameraControls.target.set( 0, 40, 0 );
+				cameraControls.target.set( 0, 50, 0 );
 				cameraControls.maxDistance = 400;
 				cameraControls.minDistance = 10;
 				cameraControls.update();

+ 2 - 2
examples/webgpu_rtt.html

@@ -24,7 +24,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { texture, uniform } from 'three/tsl';
+			import { texture, uniform, saturation, hue } from 'three/tsl';
 
 			let camera, scene, renderer;
 			const mouse = new THREE.Vector2();
@@ -79,7 +79,7 @@
 				const screenFXNode = uniform( mouse );
 
 				const materialFX = new THREE.MeshBasicNodeMaterial();
-				materialFX.colorNode = texture( renderTarget.texture ).rgb.saturation( screenFXNode.x.oneMinus() ).hue( screenFXNode.y );
+				materialFX.colorNode = hue( saturation( texture( renderTarget.texture ).rgb, screenFXNode.x.oneMinus() ), screenFXNode.y );
 
 				quadMesh = new THREE.QuadMesh( materialFX );
 

+ 2 - 2
examples/webgpu_sandbox.html

@@ -14,8 +14,8 @@
 		<script type="importmap">
 			{
 				"imports": {
-					"three": "../build/three.webgpu.js",
-					"three/tsl": "../build/three.webgpu.js",
+					"three": "../src/Three.WebGPU.js",
+					"three/tsl": "../src/Three.WebGPU.js",
 					"three/debug": "../src/Three.WebGPU.js",
 					"three/addons/": "./jsm/"
 				}

+ 2 - 2
examples/webgpu_shadowmap.html

@@ -24,7 +24,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { mx_fractal_noise_vec3, positionWorld, vec4, Fn, color, vertexIndex } from 'three/tsl';
+			import { mx_fractal_noise_vec3, positionWorld, vec4, Fn, color, vertexIndex, hash } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 
@@ -93,7 +93,7 @@
 
 				const materialColor = vec4( 1, 0, 1, .5 );
 			
-				const discardNode = vertexIndex.hash().greaterThan( 0.5 );
+				const discardNode = hash( vertexIndex ).greaterThan( 0.5 );
 
 				materialCustomShadow.colorNode = Fn( () => {
 

+ 1 - 1
examples/webgpu_shadowmap_opacity.html

@@ -32,7 +32,7 @@
 
 			let camera, scene, renderer;
 
-			init().then( render );
+			init();
 
 			async function init() {
 

+ 2 - 2
examples/webgpu_skinning_instancing.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { pass, mix, range, color, oscSine, timerLocal } from 'three/tsl';
+			import { pass, mix, range, color, oscSine, timerLocal, gaussianBlur } from 'three/tsl';
 
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
 
@@ -132,7 +132,7 @@
 				const scenePassColor = scenePass.getTextureNode();
 				const scenePassDepth = scenePass.getLinearDepthNode().remapClamp( .15, .3 );
 
-				const scenePassColorBlurred = scenePassColor.gaussianBlur();
+				const scenePassColorBlurred = gaussianBlur( scenePassColor );
 				scenePassColorBlurred.directionNode = scenePassDepth;
 
 				postProcessing = new THREE.PostProcessing( renderer );

+ 2 - 2
examples/webgpu_tsl_coffee_smoke.html

@@ -29,7 +29,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { mix, mul, positionLocal, smoothstep, texture, timerLocal, Fn, uv, vec2, vec3, vec4 } from 'three/tsl';
+			import { mix, mul, positionLocal, smoothstep, texture, timerLocal, rotateUV, Fn, uv, vec2, vec3, vec4 } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
@@ -87,7 +87,7 @@
 
 					const twistNoiseUv = vec2( 0.5, uv().y.mul( 0.2 ).sub( time.mul( 0.005 ) ).mod( 1 ) );
 					const twist = texture( noiseTexture, twistNoiseUv ).r.mul( 10 );
-					positionLocal.xz.assign( positionLocal.xz.rotateUV( twist, vec2( 0 ) ) );
+					positionLocal.xz.assign( rotateUV( positionLocal.xz, twist, vec2( 0 ) ) );
 
 					// wind
 

+ 7 - 7
examples/webgpu_tsl_compute_attractors_particles.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { float, If, PI, color, cos, instanceIndex, Loop, mix, mod, sin, storage, Fn, uint, uniform, uniformArray, vec3, vec4 } from 'three/tsl';
+			import { float, If, PI, color, cos, instanceIndex, Loop, mix, mod, sin, storage, Fn, uint, uniform, uniformArray, hash, vec3, vec4 } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
@@ -177,14 +177,14 @@
 					const velocity = velocityBuffer.element( instanceIndex );
 
 					const basePosition = vec3(
-						instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash(),
-						instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash(),
-						instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash()
+						hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) ),
+						hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) ),
+						hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) )
 					).sub( 0.5 ).mul( vec3( 5, 0.2, 5 ) );
 					position.assign( basePosition );
 
-					const phi = instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash().mul( PI ).mul( 2 );
-					const theta = instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash().mul( PI );
+					const phi = hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) ).mul( PI ).mul( 2 );
+					const theta = hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) ).mul( PI );
 					const baseVelocity = sphericalToVec3( phi, theta ).mul( 0.05 );
 					velocity.assign( baseVelocity );
 			
@@ -202,7 +202,7 @@
 
 				// update compute
 
-				const particleMassMultiplier = instanceIndex.add( uint( Math.random() * 0xffffff ) ).hash().remap( 0.25, 1 ).toVar();
+				const particleMassMultiplier = hash( instanceIndex.add( uint( Math.random() * 0xffffff ) ) ).remap( 0.25, 1 ).toVar();
 				const particleMass = particleMassMultiplier.mul( particleGlobalMass ).toVar();
 
 				const update = Fn( () => {

+ 2 - 2
examples/webgpu_tsl_earth.html

@@ -29,7 +29,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { step, normalWorld, output, texture, vec3, vec4, normalize, positionWorld, cameraPosition, color, uniform, mix, uv, max } from 'three/tsl';
+			import { step, normalWorld, output, texture, vec3, vec4, normalize, positionWorld, bumpMap, cameraPosition, color, uniform, mix, uv, max } from 'three/tsl';
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
@@ -117,7 +117,7 @@
 					texture( bumpRoughnessCloudsTexture ).r,
 					cloudsStrength
 				);
-				globeMaterial.normalNode = bumpElevation.bumpMap();
+				globeMaterial.normalNode = bumpMap( bumpElevation );
 
 				const sphereGeometry = new THREE.SphereGeometry( 1, 64, 64 );
 				globe = new THREE.Mesh( sphereGeometry, globeMaterial );

+ 2 - 2
examples/webgpu_tsl_editor.html

@@ -117,7 +117,7 @@
 
 					const tslCode = `// Simple uv.x animation
 
-const { texture, uniform, vec2, vec4, uv, oscSine, timerLocal } = THREE;
+const { texture, uniform, vec2, vec4, uv, oscSine, timerLocal, grayscale } = THREE;
 
 //const samplerTexture = new THREE.Texture();
 const samplerTexture = new THREE.TextureLoader().load( './textures/uv_grid_opengl.jpg' );
@@ -134,7 +134,7 @@ const myMap = texture( samplerTexture, animateUv ).rgb.label( 'myTexture' );
 const myColor = uniform( new THREE.Color( 0x0066ff ) ).label( 'myColor' );
 const opacity = .7;
 
-const desaturatedMap = myMap.rgb.saturation( 0 ); // try add .temp( 'myVar' ) after saturation()
+const desaturatedMap = grayscale( myMap.rgb );
 
 const finalColor = desaturatedMap.add( myColor );
 

+ 3 - 6
examples/webgpu_tsl_halftone.html

@@ -25,7 +25,7 @@
 		<script type="module">
 
 			import * as THREE from 'three';
-			import { color, mix, normalWorld, output, Fn, uniform, vec4, viewportCoordinate, viewportResolution } from 'three/tsl';
+			import { color, mix, normalWorld, output, Fn, uniform, vec4, rotate, viewportCoordinate, viewportResolution } from 'three/tsl';
 
 			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
@@ -133,11 +133,8 @@
 
 					// grid pattern
 
-					const gridUv = viewportCoordinate.xy
-						.div( viewportResolution.yy )
-						.mul( count )
-						.rotate( Math.PI * 0.25 )
-						.mod( 1 );
+					let gridUv = viewportCoordinate.xy.div( viewportResolution.yy ).mul( count );
+					gridUv = rotate( gridUv, Math.PI * 0.25 ).mod( 1 );
 
 					// orientation strength
 

+ 5 - 0
src/Three.WebGPU.js

@@ -40,6 +40,7 @@ export { DepthTexture } from './textures/DepthTexture.js';
 export { Texture } from './textures/Texture.js';
 export * from './geometries/Geometries.js';
 export * from './materials/Materials.js';
+export * from './materials/nodes/NodeMaterials.js';
 export { Material } from './materials/Material.js';
 export { AnimationLoader } from './loaders/AnimationLoader.js';
 export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js';
@@ -170,7 +171,11 @@ export { default as StorageTexture } from './renderers/common/StorageTexture.js'
 export { default as StorageBufferAttribute } from './renderers/common/StorageBufferAttribute.js';
 export { default as StorageInstancedBufferAttribute } from './renderers/common/StorageInstancedBufferAttribute.js';
 export { default as IESSpotLight } from './lights/webgpu/IESSpotLight.js';
+export { default as NodeLoader } from './loaders/nodes/NodeLoader.js';
+export { default as NodeObjectLoader } from './loaders/nodes/NodeObjectLoader.js';
+export { default as NodeMaterialLoader } from './loaders/nodes/NodeMaterialLoader.js';
 export * from './nodes/Nodes.js';
+export * from './nodes/TSL.js';
 
 if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
 

+ 4 - 4
src/nodes/loaders/NodeLoader.js → src/loaders/nodes/NodeLoader.js

@@ -1,7 +1,7 @@
-import { createNodeFromType } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { createNodeFromType } from '../../nodes/core/Node.js';
+import { nodeObject } from '../../nodes/tsl/TSLBase.js';
 
-import { Loader } from '../../loaders/Loader.js';
+import { Loader } from '../Loader.js';
 import { FileLoader } from '../../loaders/FileLoader.js';
 
 class NodeLoader extends Loader {
@@ -56,7 +56,7 @@ class NodeLoader extends Loader {
 
 				const { uuid, type } = nodeJSON;
 
-				nodes[ uuid ] = nodeObject( createNodeFromType( type ) ); // @TODO: Maybe nodeObjectify the node in createNodeFromType?
+				nodes[ uuid ] = nodeObject( createNodeFromType( type ) );
 				nodes[ uuid ].uuid = uuid;
 
 			}

+ 0 - 18
src/nodes/loaders/NodeMaterialLoader.js → src/loaders/nodes/NodeMaterialLoader.js

@@ -1,23 +1,5 @@
-import { createNodeMaterialFromType } from '../materials/Materials.js';
-
 import { MaterialLoader } from '../../loaders/MaterialLoader.js';
 
-const superFromTypeFunction = MaterialLoader.createMaterialFromType;
-
-MaterialLoader.createMaterialFromType = function ( type ) {
-
-	const material = createNodeMaterialFromType( type );
-
-	if ( material !== undefined ) {
-
-		return material;
-
-	}
-
-	return superFromTypeFunction.call( this, type );
-
-};
-
 class NodeMaterialLoader extends MaterialLoader {
 
 	constructor( manager ) {

+ 0 - 0
src/nodes/loaders/NodeObjectLoader.js → src/loaders/nodes/NodeObjectLoader.js


+ 13 - 16
src/nodes/materials/InstancedPointsNodeMaterial.js → src/materials/nodes/InstancedPointsNodeMaterial.js

@@ -1,17 +1,16 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { varying } from '../core/VaryingNode.js';
-import { property } from '../core/PropertyNode.js';
-import { attribute } from '../core/AttributeNode.js';
-import { cameraProjectionMatrix } from '../accessors/CameraNode.js';
-import { materialColor, materialPointWidth } from '../accessors/MaterialNode.js'; // or should this be a property, instead?
-import { modelViewMatrix } from '../accessors/ModelNode.js';
-import { positionGeometry } from '../accessors/PositionNode.js';
-import { smoothstep } from '../math/MathNode.js';
-import { Fn, vec2, vec4 } from '../shadernode/ShaderNode.js';
-import { uv } from '../accessors/UVNode.js';
-import { viewport } from '../display/ViewportNode.js';
-
-import { PointsMaterial } from '../../materials/PointsMaterial.js';
+import NodeMaterial from './NodeMaterial.js';
+import { property } from '../../nodes/core/PropertyNode.js';
+import { attribute } from '../../nodes/core/AttributeNode.js';
+import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
+import { materialColor, materialPointWidth } from '../../nodes/accessors/MaterialNode.js'; // or should this be a property, instead?
+import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
+import { positionGeometry } from '../../nodes/accessors/Position.js';
+import { smoothstep } from '../../nodes/math/MathNode.js';
+import { Fn, varying, vec2, vec4 } from '../../nodes/tsl/TSLBase.js';
+import { uv } from '../../nodes/accessors/UV.js';
+import { viewport } from '../../nodes/display/ViewportNode.js';
+
+import { PointsMaterial } from '../PointsMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new PointsMaterial();
 
@@ -162,5 +161,3 @@ class InstancedPointsNodeMaterial extends NodeMaterial {
 }
 
 export default InstancedPointsNodeMaterial;
-
-addNodeMaterial( 'InstancedPointsNodeMaterial', InstancedPointsNodeMaterial );

+ 17 - 21
src/nodes/materials/Line2NodeMaterial.js → src/materials/nodes/Line2NodeMaterial.js

@@ -1,19 +1,17 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { temp } from '../core/VarNode.js';
-import { varying } from '../core/VaryingNode.js';
-import { property, varyingProperty } from '../core/PropertyNode.js';
-import { attribute } from '../core/AttributeNode.js';
-import { cameraProjectionMatrix } from '../accessors/CameraNode.js';
-import { materialColor, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineDashOffset, materialLineWidth } from '../accessors/MaterialNode.js';
-import { modelViewMatrix } from '../accessors/ModelNode.js';
-import { positionGeometry } from '../accessors/PositionNode.js';
-import { mix, smoothstep } from '../math/MathNode.js';
-import { Fn, float, vec2, vec3, vec4, If } from '../shadernode/ShaderNode.js';
-import { uv } from '../accessors/UVNode.js';
-import { viewport } from '../display/ViewportNode.js';
-import { dashSize, gapSize } from '../core/PropertyNode.js';
-
-import { LineDashedMaterial } from '../../materials/LineDashedMaterial.js';
+import NodeMaterial from './NodeMaterial.js';
+import { property, varyingProperty } from '../../nodes/core/PropertyNode.js';
+import { attribute } from '../../nodes/core/AttributeNode.js';
+import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
+import { materialColor, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineDashOffset, materialLineWidth } from '../../nodes/accessors/MaterialNode.js';
+import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
+import { positionGeometry } from '../../nodes/accessors/Position.js';
+import { mix, smoothstep } from '../../nodes/math/MathNode.js';
+import { Fn, varying, float, vec2, vec3, vec4, If } from '../../nodes/tsl/TSLBase.js';
+import { uv } from '../../nodes/accessors/UV.js';
+import { viewport } from '../../nodes/display/ViewportNode.js';
+import { dashSize, gapSize } from '../../nodes/core/PropertyNode.js';
+
+import { LineDashedMaterial } from '../LineDashedMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new LineDashedMaterial();
 
@@ -127,13 +125,13 @@ class Line2NodeMaterial extends NodeMaterial {
 			const ndcEnd = clipEnd.xyz.div( clipEnd.w );
 
 			// direction
-			const dir = ndcEnd.xy.sub( ndcStart.xy ).temp();
+			const dir = ndcEnd.xy.sub( ndcStart.xy ).toVar();
 
 			// account for clip-space aspect ratio
 			dir.x.assign( dir.x.mul( aspect ) );
 			dir.assign( dir.normalize() );
 
-			const clip = temp( vec4() );
+			const clip = vec4().toVar();
 
 			if ( useWorldUnits ) {
 
@@ -176,7 +174,7 @@ class Line2NodeMaterial extends NodeMaterial {
 
 				// shift the depth of the projected points so the line
 				// segments overlap neatly
-				const clipPose = temp( vec3() );
+				const clipPose = vec3().toVar();
 
 				clipPose.assign( positionGeometry.y.lessThan( 0.5 ).select( ndcStart, ndcEnd ) );
 				clip.z.assign( clipPose.z.mul( clip.w ) );
@@ -435,5 +433,3 @@ class Line2NodeMaterial extends NodeMaterial {
 }
 
 export default Line2NodeMaterial;
-
-addNodeMaterial( 'Line2NodeMaterial', Line2NodeMaterial );

+ 2 - 4
src/nodes/materials/LineBasicNodeMaterial.js → src/materials/nodes/LineBasicNodeMaterial.js

@@ -1,6 +1,6 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
+import NodeMaterial from './NodeMaterial.js';
 
-import { LineBasicMaterial } from '../../materials/LineBasicMaterial.js';
+import { LineBasicMaterial } from '../LineBasicMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new LineBasicMaterial();
 
@@ -23,5 +23,3 @@ class LineBasicNodeMaterial extends NodeMaterial {
 }
 
 export default LineBasicNodeMaterial;
-
-addNodeMaterial( 'LineBasicNodeMaterial', LineBasicNodeMaterial );

+ 6 - 9
src/nodes/materials/LineDashedNodeMaterial.js → src/materials/nodes/LineDashedNodeMaterial.js

@@ -1,11 +1,10 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { attribute } from '../core/AttributeNode.js';
-import { varying } from '../core/VaryingNode.js';
-import { materialLineDashSize, materialLineGapSize, materialLineScale } from '../accessors/MaterialNode.js';
-import { dashSize, gapSize } from '../core/PropertyNode.js';
-import { float } from '../shadernode/ShaderNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { attribute } from '../../nodes/core/AttributeNode.js';
+import { materialLineDashSize, materialLineGapSize, materialLineScale } from '../../nodes/accessors/MaterialNode.js';
+import { dashSize, gapSize } from '../../nodes/core/PropertyNode.js';
+import { varying, float } from '../../nodes/tsl/TSLBase.js';
 
-import { LineDashedMaterial } from '../../materials/LineDashedMaterial.js';
+import { LineDashedMaterial } from '../LineDashedMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new LineDashedMaterial();
 
@@ -50,5 +49,3 @@ class LineDashedNodeMaterial extends NodeMaterial {
 }
 
 export default LineDashedNodeMaterial;
-
-addNodeMaterial( 'LineDashedNodeMaterial', LineDashedNodeMaterial );

+ 9 - 10
src/nodes/materials/MeshBasicNodeMaterial.js → src/materials/nodes/MeshBasicNodeMaterial.js

@@ -1,11 +1,12 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { materialLightMap } from '../accessors/MaterialNode.js';
-import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
-import BasicEnvironmentNode from '../lighting/BasicEnvironmentNode.js';
-import BasicLightMapNode from '../lighting/BasicLightMapNode.js';
-import BasicLightingModel from '../functions/BasicLightingModel.js';
-import { normalView } from '../accessors/NormalNode.js';
-import { diffuseColor } from '../core/PropertyNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { materialLightMap } from '../../nodes/accessors/MaterialNode.js';
+import BasicEnvironmentNode from '../../nodes/lighting/BasicEnvironmentNode.js';
+import BasicLightMapNode from '../../nodes/lighting/BasicLightMapNode.js';
+import BasicLightingModel from '../../nodes/functions/BasicLightingModel.js';
+import { normalView } from '../../nodes/accessors/Normal.js';
+import { diffuseColor } from '../../nodes/core/PropertyNode.js';
+
+import { MeshBasicMaterial } from '../MeshBasicMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshBasicMaterial();
 
@@ -68,5 +69,3 @@ class MeshBasicNodeMaterial extends NodeMaterial {
 }
 
 export default MeshBasicNodeMaterial;
-
-addNodeMaterial( 'MeshBasicNodeMaterial', MeshBasicNodeMaterial );

+ 4 - 6
src/nodes/materials/MeshLambertNodeMaterial.js → src/materials/nodes/MeshLambertNodeMaterial.js

@@ -1,8 +1,8 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import BasicEnvironmentNode from '../lighting/BasicEnvironmentNode.js';
-import PhongLightingModel from '../functions/PhongLightingModel.js';
+import NodeMaterial from './NodeMaterial.js';
+import BasicEnvironmentNode from '../../nodes/lighting/BasicEnvironmentNode.js';
+import PhongLightingModel from '../../nodes/functions/PhongLightingModel.js';
 
-import { MeshLambertMaterial } from '../../materials/MeshLambertMaterial.js';
+import { MeshLambertMaterial } from '../MeshLambertMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshLambertMaterial();
 
@@ -39,5 +39,3 @@ class MeshLambertNodeMaterial extends NodeMaterial {
 }
 
 export default MeshLambertNodeMaterial;
-
-addNodeMaterial( 'MeshLambertNodeMaterial', MeshLambertNodeMaterial );

+ 7 - 9
src/nodes/materials/MeshMatcapNodeMaterial.js → src/materials/nodes/MeshMatcapNodeMaterial.js

@@ -1,11 +1,11 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { materialReference } from '../accessors/MaterialReferenceNode.js';
-import { diffuseColor } from '../core/PropertyNode.js';
-import { vec3 } from '../shadernode/ShaderNode.js';
-import { mix } from '../math/MathNode.js';
-import { matcapUV } from '../utils/MatcapUVNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.js';
+import { diffuseColor } from '../../nodes/core/PropertyNode.js';
+import { vec3 } from '../../nodes/tsl/TSLBase.js';
+import { mix } from '../../nodes/math/MathNode.js';
+import { matcapUV } from '../../nodes/utils/MatcapUVNode.js';
 
-import { MeshMatcapMaterial } from '../../materials/MeshMatcapMaterial.js';
+import { MeshMatcapMaterial } from '../MeshMatcapMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshMatcapMaterial();
 
@@ -49,5 +49,3 @@ class MeshMatcapNodeMaterial extends NodeMaterial {
 
 
 export default MeshMatcapNodeMaterial;
-
-addNodeMaterial( 'MeshMatcapNodeMaterial', MeshMatcapNodeMaterial );

+ 7 - 9
src/nodes/materials/MeshNormalNodeMaterial.js → src/materials/nodes/MeshNormalNodeMaterial.js

@@ -1,11 +1,11 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { diffuseColor } from '../core/PropertyNode.js';
-import { directionToColor } from '../utils/Packing.js';
-import { materialOpacity } from '../accessors/MaterialNode.js';
-import { transformedNormalView } from '../accessors/NormalNode.js';
-import { float, vec4 } from '../shadernode/ShaderNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { diffuseColor } from '../../nodes/core/PropertyNode.js';
+import { directionToColor } from '../../nodes/utils/Packing.js';
+import { materialOpacity } from '../../nodes/accessors/MaterialNode.js';
+import { transformedNormalView } from '../../nodes/accessors/Normal.js';
+import { float, vec4 } from '../../nodes/tsl/TSLBase.js';
 
-import { MeshNormalMaterial } from '../../materials/MeshNormalMaterial.js';
+import { MeshNormalMaterial } from '../MeshNormalMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshNormalMaterial();
 
@@ -36,5 +36,3 @@ class MeshNormalNodeMaterial extends NodeMaterial {
 }
 
 export default MeshNormalNodeMaterial;
-
-addNodeMaterial( 'MeshNormalNodeMaterial', MeshNormalNodeMaterial );

+ 7 - 9
src/nodes/materials/MeshPhongNodeMaterial.js → src/materials/nodes/MeshPhongNodeMaterial.js

@@ -1,11 +1,11 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { shininess, specularColor } from '../core/PropertyNode.js';
-import { materialShininess, materialSpecular } from '../accessors/MaterialNode.js';
-import { float } from '../shadernode/ShaderNode.js';
-import BasicEnvironmentNode from '../lighting/BasicEnvironmentNode.js';
-import PhongLightingModel from '../functions/PhongLightingModel.js';
+import NodeMaterial from './NodeMaterial.js';
+import { shininess, specularColor } from '../../nodes/core/PropertyNode.js';
+import { materialShininess, materialSpecular } from '../../nodes/accessors/MaterialNode.js';
+import { float } from '../../nodes/tsl/TSLBase.js';
+import BasicEnvironmentNode from '../../nodes/lighting/BasicEnvironmentNode.js';
+import PhongLightingModel from '../../nodes/functions/PhongLightingModel.js';
 
-import { MeshPhongMaterial } from '../../materials/MeshPhongMaterial.js';
+import { MeshPhongMaterial } from '../MeshPhongMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshPhongMaterial();
 
@@ -70,5 +70,3 @@ class MeshPhongNodeMaterial extends NodeMaterial {
 }
 
 export default MeshPhongNodeMaterial;
-
-addNodeMaterial( 'MeshPhongNodeMaterial', MeshPhongNodeMaterial );

+ 8 - 11
src/nodes/materials/MeshPhysicalNodeMaterial.js → src/materials/nodes/MeshPhysicalNodeMaterial.js

@@ -1,14 +1,13 @@
-import { addNodeMaterial } from './NodeMaterial.js';
-import { clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, specularColor, specularF90, diffuseColor, metalness, roughness, anisotropy, alphaT, anisotropyT, anisotropyB, ior, transmission, thickness, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
-import { materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialSpecularIntensity, materialSpecularColor, materialAnisotropy, materialIOR, materialTransmission, materialThickness, materialAttenuationDistance, materialAttenuationColor, materialDispersion } from '../accessors/MaterialNode.js';
-import { float, vec2, vec3, If } from '../shadernode/ShaderNode.js';
-import getRoughness from '../functions/material/getRoughness.js';
-import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
-import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
+import { clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, specularColor, specularF90, diffuseColor, metalness, roughness, anisotropy, alphaT, anisotropyT, anisotropyB, ior, transmission, thickness, attenuationDistance, attenuationColor, dispersion } from '../../nodes/core/PropertyNode.js';
+import { materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialSpecularIntensity, materialSpecularColor, materialAnisotropy, materialIOR, materialTransmission, materialThickness, materialAttenuationDistance, materialAttenuationColor, materialDispersion } from '../../nodes/accessors/MaterialNode.js';
+import { float, vec2, vec3, If } from '../../nodes/tsl/TSLBase.js';
+import getRoughness from '../../nodes/functions/material/getRoughness.js';
+import { TBNViewMatrix } from '../../nodes/accessors/AccessorsUtils.js';
+import PhysicalLightingModel from '../../nodes/functions/PhysicalLightingModel.js';
 import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
-import { mix, pow2, min } from '../math/MathNode.js';
+import { mix, pow2, min } from '../../nodes/math/MathNode.js';
 
-import { MeshPhysicalMaterial } from '../../materials/MeshPhysicalMaterial.js';
+import { MeshPhysicalMaterial } from '../MeshPhysicalMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshPhysicalMaterial();
 
@@ -241,5 +240,3 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
 }
 
 export default MeshPhysicalNodeMaterial;
-
-addNodeMaterial( 'MeshPhysicalNodeMaterial', MeshPhysicalNodeMaterial );

+ 4 - 7
src/nodes/materials/MeshSSSNodeMaterial.js → src/materials/nodes/MeshSSSNodeMaterial.js

@@ -1,9 +1,8 @@
-import { addNodeMaterial } from './NodeMaterial.js';
-import { transformedNormalView } from '../accessors/NormalNode.js';
-import { positionViewDirection } from '../accessors/PositionNode.js';
-import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
 import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
-import { float, vec3 } from '../shadernode/ShaderNode.js';
+import PhysicalLightingModel from '../../nodes/functions/PhysicalLightingModel.js';
+import { transformedNormalView } from '../../nodes/accessors/Normal.js';
+import { positionViewDirection } from '../../nodes/accessors/Position.js';
+import { float, vec3 } from '../../nodes/tsl/TSLBase.js';
 
 class SSSLightingModel extends PhysicalLightingModel {
 
@@ -80,5 +79,3 @@ class MeshSSSNodeMaterial extends MeshPhysicalNodeMaterial {
 }
 
 export default MeshSSSNodeMaterial;
-
-addNodeMaterial( 'MeshSSSNodeMaterial', MeshSSSNodeMaterial );

+ 9 - 11
src/nodes/materials/MeshStandardNodeMaterial.js → src/materials/nodes/MeshStandardNodeMaterial.js

@@ -1,13 +1,13 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { diffuseColor, metalness, roughness, specularColor, specularF90 } from '../core/PropertyNode.js';
-import { mix } from '../math/MathNode.js';
-import { materialRoughness, materialMetalness } from '../accessors/MaterialNode.js';
-import getRoughness from '../functions/material/getRoughness.js';
-import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
-import EnvironmentNode from '../lighting/EnvironmentNode.js';
-import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { diffuseColor, metalness, roughness, specularColor, specularF90 } from '../../nodes/core/PropertyNode.js';
+import { mix } from '../../nodes/math/MathNode.js';
+import { materialRoughness, materialMetalness } from '../../nodes/accessors/MaterialNode.js';
+import getRoughness from '../../nodes/functions/material/getRoughness.js';
+import PhysicalLightingModel from '../../nodes/functions/PhysicalLightingModel.js';
+import EnvironmentNode from '../../nodes/lighting/EnvironmentNode.js';
+import { float, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
 
-import { MeshStandardMaterial } from '../../materials/MeshStandardMaterial.js';
+import { MeshStandardMaterial } from '../MeshStandardMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshStandardMaterial();
 
@@ -100,5 +100,3 @@ class MeshStandardNodeMaterial extends NodeMaterial {
 }
 
 export default MeshStandardNodeMaterial;
-
-addNodeMaterial( 'MeshStandardNodeMaterial', MeshStandardNodeMaterial );

+ 3 - 5
src/nodes/materials/MeshToonNodeMaterial.js → src/materials/nodes/MeshToonNodeMaterial.js

@@ -1,7 +1,7 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import ToonLightingModel from '../functions/ToonLightingModel.js';
+import NodeMaterial from './NodeMaterial.js';
+import ToonLightingModel from '../../nodes/functions/ToonLightingModel.js';
 
-import { MeshToonMaterial } from '../../materials/MeshToonMaterial.js';
+import { MeshToonMaterial } from '../MeshToonMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new MeshToonMaterial();
 
@@ -30,5 +30,3 @@ class MeshToonNodeMaterial extends NodeMaterial {
 }
 
 export default MeshToonNodeMaterial;
-
-addNodeMaterial( 'MeshToonNodeMaterial', MeshToonNodeMaterial );

+ 24 - 83
src/nodes/materials/NodeMaterial.js → src/materials/nodes/NodeMaterial.js

@@ -1,29 +1,27 @@
-import { Material } from '../../materials/Material.js';
+import { Material } from '../Material.js';
 import { NormalBlending } from '../../constants.js';
 
-import { getNodeChildren, getCacheKey } from '../core/NodeUtils.js';
-import { attribute } from '../core/AttributeNode.js';
-import { output, diffuseColor, emissive, varyingProperty } from '../core/PropertyNode.js';
-import { materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal, materialLightMap, materialAOMap } from '../accessors/MaterialNode.js';
-import { modelViewProjection } from '../accessors/ModelViewProjectionNode.js';
-import { normalLocal } from '../accessors/NormalNode.js';
-import { instance } from '../accessors/InstanceNode.js';
-import { batch } from '../accessors/BatchNode.js';
-import { materialReference } from '../accessors/MaterialReferenceNode.js';
-import { positionLocal } from '../accessors/PositionNode.js';
-import { skinningReference } from '../accessors/SkinningNode.js';
-import { morphReference } from '../accessors/MorphNode.js';
-import { lightsNode } from '../lighting/LightsNode.js';
-import { mix } from '../math/MathNode.js';
-import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
-import AONode from '../lighting/AONode.js';
-import { lightingContext } from '../lighting/LightingContextNode.js';
-import IrradianceNode from '../lighting/IrradianceNode.js';
-import { depth } from '../display/ViewportDepthNode.js';
-import { cameraLogDepth } from '../accessors/CameraNode.js';
-import { clipping, clippingAlpha } from '../accessors/ClippingNode.js';
-
-const NodeMaterials = new Map();
+import { getNodeChildren, getCacheKey } from '../../nodes/core/NodeUtils.js';
+import { attribute } from '../../nodes/core/AttributeNode.js';
+import { output, diffuseColor, emissive, varyingProperty } from '../../nodes/core/PropertyNode.js';
+import { materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal, materialLightMap, materialAOMap } from '../../nodes/accessors/MaterialNode.js';
+import { modelViewProjection } from '../../nodes/accessors/ModelViewProjectionNode.js';
+import { normalLocal } from '../../nodes/accessors/Normal.js';
+import { instance } from '../../nodes/accessors/InstanceNode.js';
+import { batch } from '../../nodes/accessors/BatchNode.js';
+import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.js';
+import { positionLocal } from '../../nodes/accessors/Position.js';
+import { skinningReference } from '../../nodes/accessors/SkinningNode.js';
+import { morphReference } from '../../nodes/accessors/MorphNode.js';
+import { lights } from '../../nodes/lighting/LightsNode.js';
+import { mix } from '../../nodes/math/MathNode.js';
+import { float, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
+import AONode from '../../nodes/lighting/AONode.js';
+import { lightingContext } from '../../nodes/lighting/LightingContextNode.js';
+import IrradianceNode from '../../nodes/lighting/IrradianceNode.js';
+import { depth } from '../../nodes/display/ViewportDepthNode.js';
+import { cameraLogDepth } from '../../nodes/accessors/Camera.js';
+import { clipping, clippingAlpha } from '../../nodes/accessors/ClippingNode.js';
 
 class NodeMaterial extends Material {
 
@@ -430,7 +428,7 @@ class NodeMaterial extends Material {
 
 		if ( materialLightsNode.length > 0 ) {
 
-			lightsN = lightsNode( [ ...lightsN.lightNodes, ...materialLightsNode ] );
+			lightsN = lights( [ ...lightsN.getLights(), ...materialLightsNode ] );
 
 		}
 
@@ -457,7 +455,7 @@ class NodeMaterial extends Material {
 
 		let outgoingLightNode = this.setupOutgoingLight( builder );
 
-		if ( lightsNode && lightsNode.hasLight !== false ) {
+		if ( lightsNode && lightsNode.getScope().getLights().length > 0 ) {
 
 			const lightingModel = this.setupLightingModel( builder );
 
@@ -620,63 +618,6 @@ class NodeMaterial extends Material {
 
 	}
 
-	static fromMaterial( material ) {
-
-		if ( material.isNodeMaterial === true ) { // is already a node material
-
-			return material;
-
-		}
-
-		const type = material.type.replace( 'Material', 'NodeMaterial' );
-
-		const nodeMaterial = createNodeMaterialFromType( type );
-
-		if ( nodeMaterial === undefined ) {
-
-			throw new Error( `NodeMaterial: Material "${ material.type }" is not compatible.` );
-
-		}
-
-		for ( const key in material ) {
-
-			nodeMaterial[ key ] = material[ key ];
-
-		}
-
-		return nodeMaterial;
-
-	}
-
 }
 
 export default NodeMaterial;
-
-export function addNodeMaterial( type, nodeMaterial ) {
-
-	if ( typeof nodeMaterial !== 'function' || ! type ) throw new Error( `Node material ${ type } is not a class` );
-	if ( NodeMaterials.has( type ) ) {
-
-		console.warn( `Redefinition of node material ${ type }` );
-		return;
-
-	}
-
-	NodeMaterials.set( type, nodeMaterial );
-	nodeMaterial.type = type;
-
-}
-
-export function createNodeMaterialFromType( type ) {
-
-	const Material = NodeMaterials.get( type );
-
-	if ( Material !== undefined ) {
-
-		return new Material();
-
-	}
-
-}
-
-addNodeMaterial( 'NodeMaterial', NodeMaterial );

+ 1 - 1
src/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js

@@ -1,6 +1,6 @@
 // @TODO: We can simplify "export { default as SomeNode, other, exports } from '...'" to just "export * from '...'" if we will use only named exports
 
-export { default as NodeMaterial, addNodeMaterial, createNodeMaterialFromType } from './NodeMaterial.js';
+export { default as NodeMaterial } from './NodeMaterial.js';
 export { default as InstancedPointsNodeMaterial } from './InstancedPointsNodeMaterial.js';
 export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js';
 export { default as LineDashedNodeMaterial } from './LineDashedNodeMaterial.js';

+ 2 - 4
src/nodes/materials/PointsNodeMaterial.js → src/materials/nodes/PointsNodeMaterial.js

@@ -1,6 +1,6 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
+import NodeMaterial from './NodeMaterial.js';
 
-import { PointsMaterial } from '../../materials/PointsMaterial.js';
+import { PointsMaterial } from '../PointsMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new PointsMaterial();
 
@@ -34,5 +34,3 @@ class PointsNodeMaterial extends NodeMaterial {
 }
 
 export default PointsNodeMaterial;
-
-addNodeMaterial( 'PointsNodeMaterial', PointsNodeMaterial );

+ 3 - 5
src/nodes/materials/ShadowNodeMaterial.js → src/materials/nodes/ShadowNodeMaterial.js

@@ -1,7 +1,7 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import ShadowMaskModel from '../functions/ShadowMaskModel.js';
+import NodeMaterial from './NodeMaterial.js';
+import ShadowMaskModel from '../../nodes/functions/ShadowMaskModel.js';
 
-import { ShadowMaterial } from '../../materials/ShadowMaterial.js';
+import { ShadowMaterial } from '../ShadowMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new ShadowMaterial();
 
@@ -30,5 +30,3 @@ class ShadowNodeMaterial extends NodeMaterial {
 }
 
 export default ShadowNodeMaterial;
-
-addNodeMaterial( 'ShadowNodeMaterial', ShadowNodeMaterial );

+ 10 - 11
src/nodes/materials/SpriteNodeMaterial.js → src/materials/nodes/SpriteNodeMaterial.js

@@ -1,12 +1,13 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { uniform } from '../core/UniformNode.js';
-import { cameraProjectionMatrix } from '../accessors/CameraNode.js';
-import { materialRotation } from '../accessors/MaterialNode.js';
-import { modelViewMatrix, modelWorldMatrix } from '../accessors/ModelNode.js';
-import { positionLocal } from '../accessors/PositionNode.js';
-import { float, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { uniform } from '../../nodes/core/UniformNode.js';
+import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
+import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
+import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
+import { positionLocal } from '../../nodes/accessors/Position.js';
+import { rotate } from '../../nodes/utils/RotateNode.js';
+import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
 
-import { SpriteMaterial } from '../../materials/SpriteMaterial.js';
+import { SpriteMaterial } from '../SpriteMaterial.js';
 
 const _defaultValues = /*@__PURE__*/ new SpriteMaterial();
 
@@ -60,7 +61,7 @@ class SpriteNodeMaterial extends NodeMaterial {
 
 		const rotation = float( rotationNode || materialRotation );
 
-		const rotatedPosition = alignedPosition.rotate( rotation );
+		const rotatedPosition = rotate( alignedPosition, rotation );
 
 		mvPosition = vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );
 
@@ -85,5 +86,3 @@ class SpriteNodeMaterial extends NodeMaterial {
 }
 
 export default SpriteNodeMaterial;
-
-addNodeMaterial( 'SpriteNodeMaterial', SpriteNodeMaterial );

+ 10 - 13
src/nodes/materials/VolumeNodeMaterial.js → src/materials/nodes/VolumeNodeMaterial.js

@@ -1,14 +1,13 @@
-import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
-import { varying } from '../core/VaryingNode.js';
-import { property } from '../core/PropertyNode.js';
-import { materialReference } from '../accessors/MaterialReferenceNode.js';
-import { modelWorldMatrixInverse } from '../accessors/ModelNode.js';
-import { cameraPosition } from '../accessors/CameraNode.js';
-import { positionGeometry } from '../accessors/PositionNode.js';
-import { Fn, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
-import { min, max } from '../math/MathNode.js';
-import { Loop, Break } from '../utils/LoopNode.js';
-import { texture3D } from '../accessors/Texture3DNode.js';
+import NodeMaterial from './NodeMaterial.js';
+import { property } from '../../nodes/core/PropertyNode.js';
+import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.js';
+import { modelWorldMatrixInverse } from '../../nodes/accessors/ModelNode.js';
+import { cameraPosition } from '../../nodes/accessors/Camera.js';
+import { positionGeometry } from '../../nodes/accessors/Position.js';
+import { Fn, varying, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
+import { min, max } from '../../nodes/math/MathNode.js';
+import { Loop, Break } from '../../nodes/utils/LoopNode.js';
+import { texture3D } from '../../nodes/accessors/Texture3DNode.js';
 
 class VolumeNodeMaterial extends NodeMaterial {
 
@@ -101,5 +100,3 @@ class VolumeNodeMaterial extends NodeMaterial {
 }
 
 export default VolumeNodeMaterial;
-
-addNodeMaterial( 'VolumeNodeMaterial', VolumeNodeMaterial );

+ 102 - 169
src/nodes/Nodes.js

@@ -1,20 +1,17 @@
-// @TODO: We can simplify "export { default as SomeNode, other, exports } from '...'" to just "export * from '...'" if we will use only named exports
-// this will also solve issues like "import TempNode from '../core/Node.js'"
-
 // constants
 export * from './core/constants.js';
 
 // core
-export { default as AssignNode, assign } from './core/AssignNode.js';
-export { default as AttributeNode, attribute } from './core/AttributeNode.js';
-export { default as BypassNode, bypass } from './core/BypassNode.js';
-export { default as CacheNode, cache } from './core/CacheNode.js';
+export { default as AssignNode } from './core/AssignNode.js';
+export { default as AttributeNode } from './core/AttributeNode.js';
+export { default as BypassNode } from './core/BypassNode.js';
+export { default as CacheNode } from './core/CacheNode.js';
 export { default as ConstNode } from './core/ConstNode.js';
-export { default as ContextNode, context, label } from './core/ContextNode.js';
-export { default as IndexNode, vertexIndex, instanceIndex, invocationLocalIndex, drawIndex } from './core/IndexNode.js';
+export { default as ContextNode } from './core/ContextNode.js';
+export { default as IndexNode } from './core/IndexNode.js';
 export { default as LightingModel } from './core/LightingModel.js';
-export { default as Node, addNodeClass, createNodeFromType } from './core/Node.js';
-export { default as VarNode, temp } from './core/VarNode.js';
+export { default as Node } from './core/Node.js';
+export { default as VarNode } from './core/VarNode.js';
 export { default as NodeAttribute } from './core/NodeAttribute.js';
 export { default as NodeBuilder } from './core/NodeBuilder.js';
 export { default as NodeCache } from './core/NodeCache.js';
@@ -24,166 +21,130 @@ export { default as NodeFunctionInput } from './core/NodeFunctionInput.js';
 export { default as NodeUniform } from './core/NodeUniform.js';
 export { default as NodeVar } from './core/NodeVar.js';
 export { default as NodeVarying } from './core/NodeVarying.js';
-export { default as ParameterNode, parameter } from './core/ParameterNode.js';
-export { default as PropertyNode, property, varyingProperty, output, diffuseColor, emissive, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, specularColor, shininess, dashSize, gapSize, pointWidth, alphaT, anisotropy, anisotropyB, anisotropyT } from './core/PropertyNode.js';
-export { default as StackNode, stack } from './core/StackNode.js';
+export { default as ParameterNode } from './core/ParameterNode.js';
+export { default as PropertyNode } from './core/PropertyNode.js';
+export { default as StackNode } from './core/StackNode.js';
 export { default as TempNode } from './core/TempNode.js';
-export { default as UniformGroupNode, uniformGroup, objectGroup, renderGroup, frameGroup } from './core/UniformGroupNode.js';
-export { default as UniformNode, uniform } from './core/UniformNode.js';
-export { default as VaryingNode, varying } from './core/VaryingNode.js';
-export { default as OutputStructNode, outputStruct } from './core/OutputStructNode.js';
-export { default as MRTNode, mrt } from './core/MRTNode.js';
+export { default as UniformGroupNode } from './core/UniformGroupNode.js';
+export { default as UniformNode } from './core/UniformNode.js';
+export { default as VaryingNode } from './core/VaryingNode.js';
+export { default as OutputStructNode } from './core/OutputStructNode.js';
+export { default as MRTNode } from './core/MRTNode.js';
 
 import * as NodeUtils from './core/NodeUtils.js';
 export { NodeUtils };
 
-// math
-export { default as MathNode, PI, PI2, EPSILON, INFINITY, radians, degrees, exp, exp2, log, log2, sqrt, inverseSqrt, floor, ceil, normalize, fract, sin, cos, tan, asin, acos, atan, abs, sign, length, lengthSq, negate, oneMinus, dFdx, dFdy, round, reciprocal, trunc, fwidth, bitcast, atan2, min, max, mod, step, reflect, distance, difference, dot, cross, pow, pow2, pow3, pow4, transformDirection, mix, clamp, saturate, refract, smoothstep, faceForward, cbrt, transpose, all, any, equals, rand } from './math/MathNode.js';
-
-export { default as OperatorNode, add, sub, mul, div, modInt, equal, lessThan, greaterThan, lessThanEqual, greaterThanEqual, and, or, not, xor, bitAnd, bitNot, bitOr, bitXor, shiftLeft, shiftRight, remainder } from './math/OperatorNode.js';
-export { default as CondNode, select, cond } from './math/CondNode.js';
-export * from './math/Hash.js';
-
-// math utils
-export { parabola, gain, pcurve, sinc } from './math/MathUtils.js';
-export { triNoise3D } from './math/TriNoise3D.js';
-
 // utils
 export { default as ArrayElementNode } from './utils/ArrayElementNode.js';
 export { default as ConvertNode } from './utils/ConvertNode.js';
-export * from './utils/Discard.js';
-export { default as EquirectUVNode, equirectUV } from './utils/EquirectUVNode.js';
-export { default as FunctionOverloadingNode, overloadingFn } from './utils/FunctionOverloadingNode.js';
+export { default as EquirectUVNode } from './utils/EquirectUVNode.js';
+export { default as FunctionOverloadingNode } from './utils/FunctionOverloadingNode.js';
 export { default as JoinNode } from './utils/JoinNode.js';
-export { default as LoopNode, Loop, Continue, Break } from './utils/LoopNode.js';
-export { default as MatcapUVNode, matcapUV } from './utils/MatcapUVNode.js';
-export { default as MaxMipLevelNode, maxMipLevel } from './utils/MaxMipLevelNode.js';
-export { default as OscNode, oscSine, oscSquare, oscTriangle, oscSawtooth } from './utils/OscNode.js';
-export * from './utils/Packing.js';
-export { default as RemapNode, remap, remapClamp } from './utils/RemapNode.js';
-export * from './utils/UVUtils.js';
-export * from './utils/SpriteUtils.js';
-export * from './utils/ViewportUtils.js';
-export { default as RotateNode, rotate } from './utils/RotateNode.js';
+export { default as LoopNode } from './utils/LoopNode.js';
+export { default as MatcapUVNode } from './utils/MatcapUVNode.js';
+export { default as MaxMipLevelNode } from './utils/MaxMipLevelNode.js';
+export { default as OscNode } from './utils/OscNode.js';
+export { default as RemapNode } from './utils/RemapNode.js';
+export { default as RotateNode } from './utils/RotateNode.js';
 export { default as SetNode } from './utils/SetNode.js';
 export { default as SplitNode } from './utils/SplitNode.js';
-export { default as SpriteSheetUVNode, spritesheetUV } from './utils/SpriteSheetUVNode.js';
+export { default as SpriteSheetUVNode } from './utils/SpriteSheetUVNode.js';
 export { default as StorageArrayElementNode } from './utils/StorageArrayElementNode.js';
-export { default as TimerNode, timerLocal, timerGlobal, timerDelta, frameId } from './utils/TimerNode.js';
-export { default as TriplanarTexturesNode, triplanarTextures, triplanarTexture } from './utils/TriplanarTexturesNode.js';
-export { default as ReflectorNode, reflector } from './utils/ReflectorNode.js';
-export { default as RTTNode, rtt } from './utils/RTTNode.js';
-
-// shadernode
-export * from './shadernode/ShaderNode.js';
+export { default as TimerNode } from './utils/TimerNode.js';
+export { default as TriplanarTexturesNode } from './utils/TriplanarTexturesNode.js';
+export { default as ReflectorNode } from './utils/ReflectorNode.js';
+export { default as RTTNode } from './utils/RTTNode.js';
 
 // accessors
-export { TBNViewMatrix, parallaxDirection, parallaxUV, transformedBentNormalView } from './accessors/AccessorsUtils.js';
-export { default as UniformArrayNode, uniformArray } from './accessors/UniformArrayNode.js';
-export * from './accessors/BitangentNode.js';
-export { default as BufferAttributeNode, bufferAttribute, dynamicBufferAttribute, instancedBufferAttribute, instancedDynamicBufferAttribute } from './accessors/BufferAttributeNode.js';
-export { default as BufferNode, buffer } from './accessors/BufferNode.js';
-export * from './accessors/CameraNode.js';
-export { default as VertexColorNode, vertexColor } from './accessors/VertexColorNode.js';
-export { default as CubeTextureNode, cubeTexture } from './accessors/CubeTextureNode.js';
-export { default as InstanceNode, instance } from './accessors/InstanceNode.js';
-export { default as BatchNode, batch } from './accessors/BatchNode.js';
-export { default as MaterialNode, materialAlphaTest, materialColor, materialShininess, materialEmissive, materialOpacity, materialSpecular, materialSpecularStrength, materialReflectivity, materialRoughness, materialMetalness, materialNormal, materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialRotation, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineWidth, materialLineDashOffset, materialPointWidth, materialAnisotropy, materialAnisotropyVector, materialDispersion, materialLightMap, materialAOMap } from './accessors/MaterialNode.js';
-export * from './accessors/MaterialProperties.js';
-export { default as MaterialReferenceNode, materialReference } from './accessors/MaterialReferenceNode.js';
-export { default as RendererReferenceNode, rendererReference } from './accessors/RendererReferenceNode.js';
-export { default as MorphNode, morphReference } from './accessors/MorphNode.js';
-export { default as TextureBicubicNode, textureBicubic } from './accessors/TextureBicubicNode.js';
-export { default as ModelNode, modelDirection, modelViewMatrix, modelNormalMatrix, modelWorldMatrix, modelPosition, modelViewPosition, modelScale, modelWorldMatrixInverse } from './accessors/ModelNode.js';
-export { default as ModelViewProjectionNode, modelViewProjection } from './accessors/ModelViewProjectionNode.js';
-export * from './accessors/NormalNode.js';
-export { default as Object3DNode, objectDirection, objectViewMatrix, objectNormalMatrix, objectWorldMatrix, objectPosition, objectScale, objectViewPosition } from './accessors/Object3DNode.js';
-export { default as PointUVNode, pointUV } from './accessors/PointUVNode.js';
-export * from './accessors/PositionNode.js';
-export { default as ReferenceNode, reference, referenceBuffer } from './accessors/ReferenceNode.js';
-export * from './accessors/ReflectVectorNode.js';
-export { default as SkinningNode, skinning, skinningReference } from './accessors/SkinningNode.js';
-export { default as SceneNode, backgroundBlurriness, backgroundIntensity } from './accessors/SceneNode.js';
-export { default as StorageBufferNode, storage, storageObject } from './accessors/StorageBufferNode.js';
-export * from './accessors/TangentNode.js';
-export { default as TextureNode, texture, textureLoad, /*textureLevel,*/ sampler } from './accessors/TextureNode.js';
-export { default as TextureSizeNode, textureSize } from './accessors/TextureSizeNode.js';
-export { default as StorageTextureNode, storageTexture, textureStore } from './accessors/StorageTextureNode.js';
-export { default as Texture3DNode, texture3D } from './accessors/Texture3DNode.js';
-export * from './accessors/UVNode.js';
-export { default as UserDataNode, userData } from './accessors/UserDataNode.js';
-export * from './accessors/VelocityNode.js';
+export { default as UniformArrayNode } from './accessors/UniformArrayNode.js';
+export { default as BufferAttributeNode } from './accessors/BufferAttributeNode.js';
+export { default as BufferNode } from './accessors/BufferNode.js';
+export { default as VertexColorNode } from './accessors/VertexColorNode.js';
+export { default as CubeTextureNode } from './accessors/CubeTextureNode.js';
+export { default as InstanceNode } from './accessors/InstanceNode.js';
+export { default as BatchNode } from './accessors/BatchNode.js';
+export { default as MaterialNode } from './accessors/MaterialNode.js';
+export { default as MaterialReferenceNode } from './accessors/MaterialReferenceNode.js';
+export { default as RendererReferenceNode } from './accessors/RendererReferenceNode.js';
+export { default as MorphNode } from './accessors/MorphNode.js';
+export { default as ModelNode } from './accessors/ModelNode.js';
+export { default as ModelViewProjectionNode } from './accessors/ModelViewProjectionNode.js';
+export { default as Object3DNode } from './accessors/Object3DNode.js';
+export { default as PointUVNode } from './accessors/PointUVNode.js';
+export { default as ReferenceNode } from './accessors/ReferenceNode.js';
+export { default as SkinningNode } from './accessors/SkinningNode.js';
+export { default as SceneNode } from './accessors/SceneNode.js';
+export { default as StorageBufferNode } from './accessors/StorageBufferNode.js';
+export { default as TextureNode } from './accessors/TextureNode.js';
+export { default as TextureSizeNode } from './accessors/TextureSizeNode.js';
+export { default as StorageTextureNode } from './accessors/StorageTextureNode.js';
+export { default as Texture3DNode } from './accessors/Texture3DNode.js';
+export { default as UserDataNode } from './accessors/UserDataNode.js';
 
 // display
-export * from './display/BlendModeNode.js';
-export { default as BumpMapNode, bumpMap } from './display/BumpMapNode.js';
-export * from './display/ColorAdjustmentNode.js';
-export { default as ColorSpaceNode, linearToColorSpace, colorSpaceToLinear, linearTosRGB, sRGBToLinear } from './display/ColorSpaceNode.js';
-export { default as FrontFacingNode, frontFacing, faceDirection } from './display/FrontFacingNode.js';
-export { default as NormalMapNode, normalMap } from './display/NormalMapNode.js';
-export { default as PosterizeNode, posterize } from './display/PosterizeNode.js';
-export { default as ToneMappingNode, toneMapping } from './display/ToneMappingNode.js';
-export { default as ViewportNode, viewport, viewportCoordinate, viewportResolution, viewportUV, viewportTopLeft, viewportBottomLeft } from './display/ViewportNode.js';
-export { default as ViewportTextureNode, viewportTexture, viewportMipTexture } from './display/ViewportTextureNode.js';
-export { default as ViewportSharedTextureNode, viewportSharedTexture } from './display/ViewportSharedTextureNode.js';
-export { default as ViewportDepthTextureNode, viewportDepthTexture } from './display/ViewportDepthTextureNode.js';
-export { default as ViewportDepthNode, viewZToOrthographicDepth, orthographicDepthToViewZ, viewZToPerspectiveDepth, perspectiveDepthToViewZ, depth, linearDepth, viewportLinearDepth } from './display/ViewportDepthNode.js';
-export { default as GaussianBlurNode, gaussianBlur } from './display/GaussianBlurNode.js';
-export { default as AfterImageNode, afterImage } from './display/AfterImageNode.js';
-export { default as AnamorphicNode, anamorphic } from './display/AnamorphicNode.js';
-export { default as SobelOperatorNode, sobel } from './display/SobelOperatorNode.js';
-export { default as DepthOfFieldNode, dof } from './display/DepthOfFieldNode.js';
-export { default as DotScreenNode, dotScreen } from './display/DotScreenNode.js';
-export { default as RGBShiftNode, rgbShift } from './display/RGBShiftNode.js';
-export { default as FilmNode, film } from './display/FilmNode.js';
-export { default as Lut3DNode, lut3D } from './display/Lut3DNode.js';
-export * from './display/MotionBlurNode.js';
-export { default as GTAONode, ao } from './display/GTAONode.js';
-export { default as DenoiseNode, denoise } from './display/DenoiseNode.js';
-export { default as FXAANode, fxaa } from './display/FXAANode.js';
-export { default as BloomNode, bloom } from './display/BloomNode.js';
-export { default as TransitionNode, transition } from './display/TransitionNode.js';
-export { default as RenderOutputNode, renderOutput } from './display/RenderOutputNode.js';
-export { default as PixelationPassNode, pixelationPass } from './display/PixelationPassNode.js';
-export { default as SSAAPassNode, ssaaPass } from './display/SSAAPassNode.js';
-export { default as StereoPassNode, stereoPass } from './display/StereoPassNode.js';
-export { default as AnaglyphPassNode, anaglyphPass } from './display/AnaglyphPassNode.js';
-export { default as ParallaxBarrierPassNode, parallaxBarrierPass } from './display/ParallaxBarrierPassNode.js';
-export { bleach } from './display/BleachBypassNode.js';
-export { sepia } from './display/SepiaNode.js';
-
-export { default as PassNode, pass, passTexture, depthPass } from './display/PassNode.js';
+export { default as BumpMapNode } from './display/BumpMapNode.js';
+export { default as ColorSpaceNode } from './display/ColorSpaceNode.js';
+export { default as FrontFacingNode } from './display/FrontFacingNode.js';
+export { default as NormalMapNode } from './display/NormalMapNode.js';
+export { default as PosterizeNode } from './display/PosterizeNode.js';
+export { default as ToneMappingNode } from './display/ToneMappingNode.js';
+export { default as ViewportNode } from './display/ViewportNode.js';
+export { default as ViewportTextureNode } from './display/ViewportTextureNode.js';
+export { default as ViewportSharedTextureNode } from './display/ViewportSharedTextureNode.js';
+export { default as ViewportDepthTextureNode } from './display/ViewportDepthTextureNode.js';
+export { default as ViewportDepthNode } from './display/ViewportDepthNode.js';
+export { default as GaussianBlurNode } from './display/GaussianBlurNode.js';
+export { default as AfterImageNode } from './display/AfterImageNode.js';
+export { default as AnamorphicNode } from './display/AnamorphicNode.js';
+export { default as SobelOperatorNode } from './display/SobelOperatorNode.js';
+export { default as DepthOfFieldNode } from './display/DepthOfFieldNode.js';
+export { default as DotScreenNode } from './display/DotScreenNode.js';
+export { default as RGBShiftNode } from './display/RGBShiftNode.js';
+export { default as FilmNode } from './display/FilmNode.js';
+export { default as Lut3DNode } from './display/Lut3DNode.js';
+export { default as GTAONode } from './display/GTAONode.js';
+export { default as DenoiseNode } from './display/DenoiseNode.js';
+export { default as FXAANode } from './display/FXAANode.js';
+export { default as BloomNode } from './display/BloomNode.js';
+export { default as TransitionNode } from './display/TransitionNode.js';
+export { default as RenderOutputNode } from './display/RenderOutputNode.js';
+export { default as PixelationPassNode } from './display/PixelationPassNode.js';
+export { default as SSAAPassNode } from './display/SSAAPassNode.js';
+export { default as StereoPassNode } from './display/StereoPassNode.js';
+export { default as AnaglyphPassNode } from './display/AnaglyphPassNode.js';
+export { default as ParallaxBarrierPassNode } from './display/ParallaxBarrierPassNode.js';
+export { default as PassNode } from './display/PassNode.js';
 
 // code
-export { default as ExpressionNode, expression } from './code/ExpressionNode.js';
-export { default as CodeNode, code, js, wgsl, glsl } from './code/CodeNode.js';
-export { default as FunctionCallNode, call } from './code/FunctionCallNode.js';
-export { default as FunctionNode, wgslFn, glslFn } from './code/FunctionNode.js';
-export { default as ScriptableNode, scriptable, global } from './code/ScriptableNode.js';
-export { default as ScriptableValueNode, scriptableValue } from './code/ScriptableValueNode.js';
+export { default as ExpressionNode } from './code/ExpressionNode.js';
+export { default as CodeNode } from './code/CodeNode.js';
+export { default as FunctionCallNode } from './code/FunctionCallNode.js';
+export { default as FunctionNode } from './code/FunctionNode.js';
+export { default as ScriptableNode } from './code/ScriptableNode.js';
+export { default as ScriptableValueNode } from './code/ScriptableValueNode.js';
 
 // fog
-export { default as FogNode, fog } from './fog/FogNode.js';
-export { default as FogRangeNode, rangeFog } from './fog/FogRangeNode.js';
-export { default as FogExp2Node, densityFog } from './fog/FogExp2Node.js';
+export { default as FogNode } from './fog/FogNode.js';
+export { default as FogRangeNode } from './fog/FogRangeNode.js';
+export { default as FogExp2Node } from './fog/FogExp2Node.js';
 
 // geometry
-export { default as RangeNode, range } from './geometry/RangeNode.js';
+export { default as RangeNode } from './geometry/RangeNode.js';
 
 // gpgpu
-export { default as ComputeNode, compute } from './gpgpu/ComputeNode.js';
+export { default as ComputeNode } from './gpgpu/ComputeNode.js';
 
 // lighting
-export { default as LightNode, lightTargetDirection } from './lighting/LightNode.js';
+export { default as LightNode } from './lighting/LightNode.js';
 export { default as PointLightNode } from './lighting/PointLightNode.js';
 export { default as DirectionalLightNode } from './lighting/DirectionalLightNode.js';
 export { default as RectAreaLightNode } from './lighting/RectAreaLightNode.js';
 export { default as SpotLightNode } from './lighting/SpotLightNode.js';
 export { default as IESSpotLightNode } from './lighting/IESSpotLightNode.js';
 export { default as AmbientLightNode } from './lighting/AmbientLightNode.js';
-export { default as LightsNode, lights, lightsNode, addLightNode } from './lighting/LightsNode.js';
-export { default as LightingNode /* @TODO: lighting (abstract), light */ } from './lighting/LightingNode.js';
-export { default as LightingContextNode, lightingContext } from './lighting/LightingContextNode.js';
+export { default as LightsNode } from './lighting/LightsNode.js';
+export { default as LightingNode } from './lighting/LightingNode.js';
+export { default as LightingContextNode } from './lighting/LightingContextNode.js';
 export { default as HemisphereLightNode } from './lighting/HemisphereLightNode.js';
 export { default as LightProbeNode } from './lighting/LightProbeNode.js';
 export { default as EnvironmentNode } from './lighting/EnvironmentNode.js';
@@ -193,39 +154,11 @@ export { default as AONode } from './lighting/AONode.js';
 export { default as AnalyticLightNode } from './lighting/AnalyticLightNode.js';
 
 // pmrem
-export { default as PMREMNode, pmremTexture } from './pmrem/PMREMNode.js';
-export * from './pmrem/PMREMUtils.js';
-
-// procedural
-export { default as CheckerNode, checker } from './procedural/CheckerNode.js';
-
-// loaders
-export { default as NodeLoader } from './loaders/NodeLoader.js';
-export { default as NodeObjectLoader } from './loaders/NodeObjectLoader.js';
-export { default as NodeMaterialLoader } from './loaders/NodeMaterialLoader.js';
+export { default as PMREMNode } from './pmrem/PMREMNode.js';
 
 // parsers
 export { default as GLSLNodeParser } from './parsers/GLSLNodeParser.js'; // @TODO: Move to jsm/renderers/webgl.
 
-// materials
-export * from './materials/Materials.js';
-
-// materialX
-export * from './materialx/MaterialXNodes.js';
-
-// functions
-export { default as BRDF_GGX } from './functions/BSDF/BRDF_GGX.js';
-export { default as BRDF_Lambert } from './functions/BSDF/BRDF_Lambert.js';
-export { default as D_GGX } from './functions/BSDF/D_GGX.js';
-export { default as DFGApprox } from './functions/BSDF/DFGApprox.js';
-export { default as F_Schlick } from './functions/BSDF/F_Schlick.js';
-export { default as Schlick_to_F0 } from './functions/BSDF/Schlick_to_F0.js';
-export { default as V_GGX_SmithCorrelated } from './functions/BSDF/V_GGX_SmithCorrelated.js';
-
-export { getDistanceAttenuation } from './lighting/LightUtils.js';
-
-export { default as getGeometryRoughness } from './functions/material/getGeometryRoughness.js';
-export { default as getRoughness } from './functions/material/getRoughness.js';
-
+// lighting models
 export { default as PhongLightingModel } from './functions/PhongLightingModel.js';
 export { default as PhysicalLightingModel } from './functions/PhysicalLightingModel.js';

+ 176 - 0
src/nodes/TSL.js

@@ -0,0 +1,176 @@
+// constants
+export * from './core/constants.js';
+
+// core
+export * from './core/AssignNode.js';
+export * from './core/AttributeNode.js';
+export * from './core/BypassNode.js';
+export * from './core/CacheNode.js';
+export * from './core/ContextNode.js';
+export * from './core/IndexNode.js';
+export * from './core/ParameterNode.js';
+export * from './core/PropertyNode.js';
+export * from './core/StackNode.js';
+export * from './core/UniformGroupNode.js';
+export * from './core/UniformNode.js';
+export * from './core/VaryingNode.js';
+export * from './core/OutputStructNode.js';
+export * from './core/MRTNode.js';
+
+// math
+export * from './math/Hash.js';
+export * from './math/MathUtils.js';
+export * from './math/TriNoise3D.js';
+
+// utils
+export { default as EquirectUVNode, equirectUV } from './utils/EquirectUVNode.js';
+export { default as FunctionOverloadingNode, overloadingFn } from './utils/FunctionOverloadingNode.js';
+export { default as LoopNode, Loop, Continue, Break } from './utils/LoopNode.js';
+export { default as MatcapUVNode, matcapUV } from './utils/MatcapUVNode.js';
+export { default as MaxMipLevelNode, maxMipLevel } from './utils/MaxMipLevelNode.js';
+export { default as OscNode, oscSine, oscSquare, oscTriangle, oscSawtooth } from './utils/OscNode.js';
+export * from './utils/Packing.js';
+export { default as RemapNode, remap, remapClamp } from './utils/RemapNode.js';
+export * from './utils/UVUtils.js';
+export * from './utils/SpriteUtils.js';
+export * from './utils/ViewportUtils.js';
+export { default as RotateNode, rotate } from './utils/RotateNode.js';
+export { default as SpriteSheetUVNode, spritesheetUV } from './utils/SpriteSheetUVNode.js';
+export { default as TimerNode, timerLocal, timerGlobal, timerDelta, frameId } from './utils/TimerNode.js';
+export { default as TriplanarTexturesNode, triplanarTextures, triplanarTexture } from './utils/TriplanarTexturesNode.js';
+export { default as ReflectorNode, reflector } from './utils/ReflectorNode.js';
+export { default as RTTNode, rtt, convertToTexture } from './utils/RTTNode.js';
+
+// three.js shading language
+export * from './tsl/TSLBase.js';
+
+// accessors
+export * from './accessors/AccessorsUtils.js';
+export { default as UniformArrayNode, uniformArray } from './accessors/UniformArrayNode.js';
+export * from './accessors/Bitangent.js';
+export { default as BufferAttributeNode, bufferAttribute, dynamicBufferAttribute, instancedBufferAttribute, instancedDynamicBufferAttribute } from './accessors/BufferAttributeNode.js';
+export { default as BufferNode, buffer } from './accessors/BufferNode.js';
+export * from './accessors/Camera.js';
+export { default as VertexColorNode, vertexColor } from './accessors/VertexColorNode.js';
+export { default as CubeTextureNode, cubeTexture } from './accessors/CubeTextureNode.js';
+export { default as InstanceNode, instance } from './accessors/InstanceNode.js';
+export { default as BatchNode, batch } from './accessors/BatchNode.js';
+export { default as MaterialNode, materialAlphaTest, materialColor, materialShininess, materialEmissive, materialOpacity, materialSpecular, materialSpecularStrength, materialReflectivity, materialRoughness, materialMetalness, materialNormal, materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialRotation, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineWidth, materialLineDashOffset, materialPointWidth, materialAnisotropy, materialAnisotropyVector, materialDispersion, materialLightMap, materialAOMap } from './accessors/MaterialNode.js';
+export * from './accessors/MaterialProperties.js';
+export { default as MaterialReferenceNode, materialReference } from './accessors/MaterialReferenceNode.js';
+export { default as RendererReferenceNode, rendererReference } from './accessors/RendererReferenceNode.js';
+export { default as MorphNode, morphReference } from './accessors/MorphNode.js';
+export * from './accessors/TextureBicubic.js';
+export { default as ModelNode, modelDirection, modelViewMatrix, modelNormalMatrix, modelWorldMatrix, modelPosition, modelViewPosition, modelScale, modelWorldMatrixInverse } from './accessors/ModelNode.js';
+export { default as ModelViewProjectionNode, modelViewProjection } from './accessors/ModelViewProjectionNode.js';
+export * from './accessors/Normal.js';
+export { default as Object3DNode, objectDirection, objectViewMatrix, objectNormalMatrix, objectWorldMatrix, objectPosition, objectScale, objectViewPosition } from './accessors/Object3DNode.js';
+export { default as PointUVNode, pointUV } from './accessors/PointUVNode.js';
+export * from './accessors/Position.js';
+export { default as ReferenceNode, reference, referenceBuffer } from './accessors/ReferenceNode.js';
+export * from './accessors/ReflectVector.js';
+export { default as SkinningNode, skinning, skinningReference } from './accessors/SkinningNode.js';
+export { default as SceneNode, backgroundBlurriness, backgroundIntensity } from './accessors/SceneNode.js';
+export { default as StorageBufferNode, storage, storageObject } from './accessors/StorageBufferNode.js';
+export * from './accessors/Tangent.js';
+export { default as TextureNode, texture, textureLoad, /*textureLevel,*/ sampler } from './accessors/TextureNode.js';
+export { default as TextureSizeNode, textureSize } from './accessors/TextureSizeNode.js';
+export { default as StorageTextureNode, storageTexture, textureStore } from './accessors/StorageTextureNode.js';
+export { default as Texture3DNode, texture3D } from './accessors/Texture3DNode.js';
+export * from './accessors/UV.js';
+export { default as UserDataNode, userData } from './accessors/UserDataNode.js';
+export * from './accessors/VelocityNode.js';
+
+// display
+export * from './display/BlendMode.js';
+export { default as BumpMapNode, bumpMap } from './display/BumpMapNode.js';
+export * from './display/ColorAdjustment.js';
+export { default as ColorSpaceNode, linearToColorSpace, colorSpaceToLinear } from './display/ColorSpaceNode.js';
+export { default as FrontFacingNode, frontFacing, faceDirection } from './display/FrontFacingNode.js';
+export { default as NormalMapNode, normalMap } from './display/NormalMapNode.js';
+export { default as PosterizeNode, posterize } from './display/PosterizeNode.js';
+export { default as ToneMappingNode, toneMapping } from './display/ToneMappingNode.js';
+export { default as ViewportNode, viewport, viewportCoordinate, viewportResolution, viewportUV, viewportTopLeft, viewportBottomLeft } from './display/ViewportNode.js';
+export { default as ViewportTextureNode, viewportTexture, viewportMipTexture } from './display/ViewportTextureNode.js';
+export { default as ViewportSharedTextureNode, viewportSharedTexture } from './display/ViewportSharedTextureNode.js';
+export { default as ViewportDepthTextureNode, viewportDepthTexture } from './display/ViewportDepthTextureNode.js';
+export { default as ViewportDepthNode, viewZToOrthographicDepth, orthographicDepthToViewZ, viewZToPerspectiveDepth, perspectiveDepthToViewZ, depth, linearDepth, viewportLinearDepth } from './display/ViewportDepthNode.js';
+export { default as GaussianBlurNode, gaussianBlur } from './display/GaussianBlurNode.js';
+export { default as AfterImageNode, afterImage } from './display/AfterImageNode.js';
+export { default as AnamorphicNode, anamorphic } from './display/AnamorphicNode.js';
+export { default as SobelOperatorNode, sobel } from './display/SobelOperatorNode.js';
+export { default as DepthOfFieldNode, dof } from './display/DepthOfFieldNode.js';
+export { default as DotScreenNode, dotScreen } from './display/DotScreenNode.js';
+export { default as RGBShiftNode, rgbShift } from './display/RGBShiftNode.js';
+export { default as FilmNode, film } from './display/FilmNode.js';
+export { default as Lut3DNode, lut3D } from './display/Lut3DNode.js';
+export * from './display/MotionBlur.js';
+export { default as GTAONode, ao } from './display/GTAONode.js';
+export { default as DenoiseNode, denoise } from './display/DenoiseNode.js';
+export { default as FXAANode, fxaa } from './display/FXAANode.js';
+export { default as BloomNode, bloom } from './display/BloomNode.js';
+export { default as TransitionNode, transition } from './display/TransitionNode.js';
+export { default as RenderOutputNode, renderOutput } from './display/RenderOutputNode.js';
+export { default as PixelationPassNode, pixelationPass } from './display/PixelationPassNode.js';
+export { default as SSAAPassNode, ssaaPass } from './display/SSAAPassNode.js';
+export { default as StereoPassNode, stereoPass } from './display/StereoPassNode.js';
+export { default as AnaglyphPassNode, anaglyphPass } from './display/AnaglyphPassNode.js';
+export { default as ParallaxBarrierPassNode, parallaxBarrierPass } from './display/ParallaxBarrierPassNode.js';
+export { bleach } from './display/BleachBypass.js';
+export { sepia } from './display/Sepia.js';
+
+export { default as PassNode, pass, passTexture, depthPass } from './display/PassNode.js';
+
+import * as ColorSpaceFunctions from './display/ColorSpaceFunctions.js';
+export { ColorSpaceFunctions };
+
+import * as ToneMappingFunctions from './display/ToneMappingFunctions.js';
+export { ToneMappingFunctions };
+
+// code
+export { default as ExpressionNode, expression } from './code/ExpressionNode.js';
+export { default as CodeNode, code, js, wgsl, glsl } from './code/CodeNode.js';
+export { default as FunctionCallNode, call } from './code/FunctionCallNode.js';
+export { default as FunctionNode, wgslFn, glslFn } from './code/FunctionNode.js';
+export { default as ScriptableNode, scriptable, global } from './code/ScriptableNode.js';
+export { default as ScriptableValueNode, scriptableValue } from './code/ScriptableValueNode.js';
+
+// fog
+export { default as FogNode, fog } from './fog/FogNode.js';
+export { default as FogRangeNode, rangeFog } from './fog/FogRangeNode.js';
+export { default as FogExp2Node, densityFog } from './fog/FogExp2Node.js';
+
+// geometry
+export { default as RangeNode, range } from './geometry/RangeNode.js';
+
+// gpgpu
+export { default as ComputeNode, compute } from './gpgpu/ComputeNode.js';
+
+// lighting
+export { default as LightNode, lightTargetDirection } from './lighting/LightNode.js';
+export { default as LightsNode, lights } from './lighting/LightsNode.js';
+export { default as LightingContextNode, lightingContext } from './lighting/LightingContextNode.js';
+
+// pmrem
+export { default as PMREMNode, pmremTexture } from './pmrem/PMREMNode.js';
+export * from './pmrem/PMREMUtils.js';
+
+// procedural
+export * from './procedural/Checker.js';
+
+// materialX
+export * from './materialx/MaterialXNodes.js';
+
+// functions
+export { default as BRDF_GGX } from './functions/BSDF/BRDF_GGX.js';
+export { default as BRDF_Lambert } from './functions/BSDF/BRDF_Lambert.js';
+export { default as D_GGX } from './functions/BSDF/D_GGX.js';
+export { default as DFGApprox } from './functions/BSDF/DFGApprox.js';
+export { default as F_Schlick } from './functions/BSDF/F_Schlick.js';
+export { default as Schlick_to_F0 } from './functions/BSDF/Schlick_to_F0.js';
+export { default as V_GGX_SmithCorrelated } from './functions/BSDF/V_GGX_SmithCorrelated.js';
+
+export * from './lighting/LightUtils.js';
+
+export { default as getGeometryRoughness } from './functions/material/getGeometryRoughness.js';
+export { default as getRoughness } from './functions/material/getRoughness.js';

+ 5 - 5
src/nodes/accessors/AccessorsUtils.js

@@ -1,10 +1,10 @@
-import { bitangentView } from './BitangentNode.js';
-import { normalView, transformedNormalView } from './NormalNode.js';
-import { tangentView } from './TangentNode.js';
-import { mat3 } from '../shadernode/ShaderNode.js';
+import { bitangentView } from './Bitangent.js';
+import { normalView, transformedNormalView } from './Normal.js';
+import { tangentView } from './Tangent.js';
+import { mat3 } from '../tsl/TSLBase.js';
 import { mix } from '../math/MathNode.js';
 import { anisotropy, anisotropyB, roughness } from '../core/PropertyNode.js';
-import { positionViewDirection } from './PositionNode.js';
+import { positionViewDirection } from './Position.js';
 
 export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView );
 

+ 7 - 7
src/nodes/accessors/BatchNode.js

@@ -1,10 +1,10 @@
-import Node, { addNodeClass } from '../core/Node.js';
-import { normalLocal } from './NormalNode.js';
-import { positionLocal } from './PositionNode.js';
-import { nodeProxy, vec3, mat3, mat4, int, ivec2, float, Fn } from '../shadernode/ShaderNode.js';
+import Node, { registerNodeClass } from '../core/Node.js';
+import { normalLocal } from './Normal.js';
+import { positionLocal } from './Position.js';
+import { nodeProxy, vec3, mat3, mat4, int, ivec2, float, Fn } from '../tsl/TSLBase.js';
 import { textureLoad } from './TextureNode.js';
 import { textureSize } from './TextureSizeNode.js';
-import { tangentLocal } from './TangentNode.js';
+import { tangentLocal } from './Tangent.js';
 import { instanceIndex, drawIndex } from '../core/IndexNode.js';
 import { varyingProperty } from '../core/PropertyNode.js';
 
@@ -119,6 +119,6 @@ class BatchNode extends Node {
 
 export default BatchNode;
 
-export const batch = nodeProxy( BatchNode );
+registerNodeClass( 'Batch', BatchNode );
 
-addNodeClass( 'batch', BatchNode );
+export const batch = nodeProxy( BatchNode );

+ 3 - 3
src/nodes/accessors/BitangentNode.js → src/nodes/accessors/Bitangent.js

@@ -1,7 +1,7 @@
 import { varying } from '../core/VaryingNode.js';
-import { cameraViewMatrix } from './CameraNode.js';
-import { normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView } from './NormalNode.js';
-import { tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView } from './TangentNode.js';
+import { cameraViewMatrix } from './Camera.js';
+import { normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView } from './Normal.js';
+import { tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView } from './Tangent.js';
 
 const getBitangent = ( crossNormalTangent ) => crossNormalTangent.mul( tangentGeometry.w ).xyz;
 

+ 5 - 5
src/nodes/accessors/BufferAttributeNode.js

@@ -1,7 +1,7 @@
+import { registerNodeClass } from '../core/Node.js';
 import InputNode from '../core/InputNode.js';
-import { addNodeClass } from '../core/Node.js';
+import { nodeObject, addMethodChaining } from '../tsl/TSLCore.js';
 import { varying } from '../core/VaryingNode.js';
-import { nodeObject, addNodeElement } from '../shadernode/ShaderNode.js';
 
 import { InterleavedBufferAttribute } from '../../core/InterleavedBufferAttribute.js';
 import { InterleavedBuffer } from '../../core/InterleavedBuffer.js';
@@ -151,12 +151,12 @@ class BufferAttributeNode extends InputNode {
 
 export default BufferAttributeNode;
 
+registerNodeClass( 'BufferAttribute', BufferAttributeNode );
+
 export const bufferAttribute = ( array, type, stride, offset ) => nodeObject( new BufferAttributeNode( array, type, stride, offset ) );
 export const dynamicBufferAttribute = ( array, type, stride, offset ) => bufferAttribute( array, type, stride, offset ).setUsage( DynamicDrawUsage );
 
 export const instancedBufferAttribute = ( array, type, stride, offset ) => bufferAttribute( array, type, stride, offset ).setInstanced( true );
 export const instancedDynamicBufferAttribute = ( array, type, stride, offset ) => dynamicBufferAttribute( array, type, stride, offset ).setInstanced( true );
 
-addNodeElement( 'toAttribute', ( bufferNode ) => bufferAttribute( bufferNode.value ) );
-
-addNodeClass( 'BufferAttributeNode', BufferAttributeNode );
+addMethodChaining( 'toAttribute', ( bufferNode ) => bufferAttribute( bufferNode.value ) );

+ 4 - 4
src/nodes/accessors/BufferNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import UniformNode from '../core/UniformNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 
 class BufferNode extends UniformNode {
 
@@ -31,6 +31,6 @@ class BufferNode extends UniformNode {
 
 export default BufferNode;
 
-export const buffer = ( value, type, count ) => nodeObject( new BufferNode( value, type, count ) );
+registerNodeClass( 'Buffer', BufferNode );
 
-addNodeClass( 'BufferNode', BufferNode );
+export const buffer = ( value, type, count ) => nodeObject( new BufferNode( value, type, count ) );

+ 0 - 0
src/nodes/accessors/CameraNode.js → src/nodes/accessors/Camera.js


+ 6 - 4
src/nodes/accessors/ClippingNode.js

@@ -1,9 +1,9 @@
 
-import Node from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
-import { positionView } from './PositionNode.js';
+import Node, { registerNodeClass } from '../core/Node.js';
+import { nodeObject } from '../tsl/TSLBase.js';
+import { positionView } from './Position.js';
 import { diffuseColor, property } from '../core/PropertyNode.js';
-import { Fn } from '../shadernode/ShaderNode.js';
+import { Fn } from '../tsl/TSLBase.js';
 import { Loop } from '../utils/LoopNode.js';
 import { smoothstep } from '../math/MathNode.js';
 import { uniformArray } from './UniformArrayNode.js';
@@ -140,6 +140,8 @@ ClippingNode.DEFAULT = 'default';
 
 export default ClippingNode;
 
+registerNodeClass( 'Clipping', ClippingNode );
+
 export const clipping = () => nodeObject( new ClippingNode() );
 
 export const clippingAlpha = () => nodeObject( new ClippingNode( ClippingNode.ALPHA_TO_COVERAGE ) );

+ 5 - 7
src/nodes/accessors/CubeTextureNode.js

@@ -1,7 +1,7 @@
+import { registerNodeClass } from '../core/Node.js';
 import TextureNode from './TextureNode.js';
-import { reflectVector, refractVector } from './ReflectVectorNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
+import { reflectVector, refractVector } from './ReflectVector.js';
+import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
 
 import { CubeReflectionMapping, CubeRefractionMapping, WebGPUCoordinateSystem } from '../../constants.js';
 
@@ -71,8 +71,6 @@ class CubeTextureNode extends TextureNode {
 
 export default CubeTextureNode;
 
-export const cubeTexture = nodeProxy( CubeTextureNode );
-
-addNodeElement( 'cubeTexture', cubeTexture );
+registerNodeClass( 'CubeTexture', CubeTextureNode );
 
-addNodeClass( 'CubeTextureNode', CubeTextureNode );
+export const cubeTexture = nodeProxy( CubeTextureNode );

+ 6 - 6
src/nodes/accessors/InstanceNode.js

@@ -1,9 +1,9 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { varyingProperty } from '../core/PropertyNode.js';
 import { instancedBufferAttribute, instancedDynamicBufferAttribute } from './BufferAttributeNode.js';
-import { normalLocal } from './NormalNode.js';
-import { positionLocal } from './PositionNode.js';
-import { nodeProxy, vec3, mat3, mat4 } from '../shadernode/ShaderNode.js';
+import { normalLocal } from './Normal.js';
+import { positionLocal } from './Position.js';
+import { nodeProxy, vec3, mat3, mat4 } from '../tsl/TSLBase.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { buffer } from '../accessors/BufferNode.js';
 import { instanceIndex } from '../core/IndexNode.js';
@@ -139,6 +139,6 @@ class InstanceNode extends Node {
 
 export default InstanceNode;
 
-export const instance = nodeProxy( InstanceNode );
+registerNodeClass( 'Instance', InstanceNode );
 
-addNodeClass( 'InstanceNode', InstanceNode );
+export const instance = nodeProxy( InstanceNode );

+ 4 - 4
src/nodes/accessors/InstancedPointsMaterialNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import MaterialNode from './MaterialNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeImmutable } from '../shadernode/ShaderNode.js';
+import { nodeImmutable } from '../tsl/TSLBase.js';
 
 class InstancedPointsMaterialNode extends MaterialNode {
 
@@ -16,6 +16,6 @@ InstancedPointsMaterialNode.POINT_WIDTH = 'pointWidth';
 
 export default InstancedPointsMaterialNode;
 
-export const materialPointWidth = nodeImmutable( InstancedPointsMaterialNode, InstancedPointsMaterialNode.POINT_WIDTH );
+registerNodeClass( 'InstancedPointsMaterial', InstancedPointsMaterialNode );
 
-addNodeClass( 'InstancedPointsMaterialNode', InstancedPointsMaterialNode );
+export const materialPointWidth = nodeImmutable( InstancedPointsMaterialNode, InstancedPointsMaterialNode.POINT_WIDTH );

+ 10 - 8
src/nodes/accessors/MaterialNode.js

@@ -1,9 +1,11 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { reference } from './ReferenceNode.js';
 import { materialReference } from './MaterialReferenceNode.js';
-import { normalView } from './NormalNode.js';
-import { nodeImmutable, float, vec2, vec3, mat2 } from '../shadernode/ShaderNode.js';
+import { normalView } from './Normal.js';
+import { nodeImmutable, float, vec2, vec3, mat2 } from '../tsl/TSLBase.js';
 import { uniform } from '../core/UniformNode.js';
+import { normalMap } from '../display/NormalMapNode.js';
+import { bumpMap } from '../display/BumpMapNode.js';
 
 import { Vector2 } from '../../math/Vector2.js';
 
@@ -175,11 +177,11 @@ class MaterialNode extends Node {
 
 			if ( material.normalMap ) {
 
-				node = this.getTexture( 'normal' ).normalMap( this.getCache( 'normalScale', 'vec2' ) );
+				node = normalMap( this.getTexture( 'normal' ), this.getCache( 'normalScale', 'vec2' ) );
 
 			} else if ( material.bumpMap ) {
 
-				node = this.getTexture( 'bump' ).r.bumpMap( this.getFloat( 'bumpScale' ) );
+				node = bumpMap( this.getTexture( 'bump' ).r, this.getFloat( 'bumpScale' ) );
 
 			} else {
 
@@ -219,7 +221,7 @@ class MaterialNode extends Node {
 
 			if ( material.clearcoatNormalMap ) {
 
-				node = this.getTexture( scope ).normalMap( this.getCache( scope + 'Scale', 'vec2' ) );
+				node = normalMap( this.getTexture( scope ), this.getCache( scope + 'Scale', 'vec2' ) );
 
 			} else {
 
@@ -382,6 +384,8 @@ MaterialNode.AO_MAP = 'ao';
 
 export default MaterialNode;
 
+registerNodeClass( 'Material', MaterialNode );
+
 export const materialAlphaTest = nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST );
 export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR );
 export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS );
@@ -431,5 +435,3 @@ export const materialAnisotropyVector = uniform( new Vector2() ).onReference( fu
 	this.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );
 
 } );
-
-addNodeClass( 'MaterialNode', MaterialNode );

+ 4 - 4
src/nodes/accessors/MaterialReferenceNode.js

@@ -1,8 +1,8 @@
+import { registerNodeClass } from '../core/Node.js';
 import ReferenceNode from './ReferenceNode.js';
 //import { renderGroup } from '../core/UniformGroupNode.js';
 //import { NodeUpdateType } from '../core/constants.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 
 class MaterialReferenceNode extends ReferenceNode {
 
@@ -38,6 +38,6 @@ class MaterialReferenceNode extends ReferenceNode {
 
 export default MaterialReferenceNode;
 
-export const materialReference = ( name, type, material ) => nodeObject( new MaterialReferenceNode( name, type, material ) );
+registerNodeClass( 'MaterialReference', MaterialReferenceNode );
 
-addNodeClass( 'MaterialReferenceNode', MaterialReferenceNode );
+export const materialReference = ( name, type, material ) => nodeObject( new MaterialReferenceNode( name, type, material ) );

+ 5 - 5
src/nodes/accessors/ModelNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import Object3DNode from './Object3DNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeImmutable } from '../shadernode/ShaderNode.js';
+import { nodeImmutable } from '../tsl/TSLBase.js';
 import { uniform } from '../core/UniformNode.js';
 
 import { Matrix4 } from '../../math/Matrix4.js';
@@ -25,13 +25,13 @@ class ModelNode extends Object3DNode {
 
 export default ModelNode;
 
+registerNodeClass( 'Model', ModelNode );
+
 export const modelDirection = nodeImmutable( ModelNode, ModelNode.DIRECTION );
-export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ).label( 'modelViewMatrix' ).temp( 'ModelViewMatrix' );
+export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ).label( 'modelViewMatrix' ).toVar( 'ModelViewMatrix' );
 export const modelNormalMatrix = nodeImmutable( ModelNode, ModelNode.NORMAL_MATRIX );
 export const modelWorldMatrix = nodeImmutable( ModelNode, ModelNode.WORLD_MATRIX );
 export const modelPosition = nodeImmutable( ModelNode, ModelNode.POSITION );
 export const modelScale = nodeImmutable( ModelNode, ModelNode.SCALE );
 export const modelViewPosition = nodeImmutable( ModelNode, ModelNode.VIEW_POSITION );
 export const modelWorldMatrixInverse = uniform( new Matrix4() ).onObjectUpdate( ( { object }, self ) => self.value.copy( object.matrixWorld ).invert() );
-
-addNodeClass( 'ModelNode', ModelNode );

+ 6 - 7
src/nodes/accessors/ModelViewProjectionNode.js

@@ -1,10 +1,9 @@
-import { addNodeClass } from '../core/Node.js';
+import { registerNodeClass } from '../core/Node.js';
 import TempNode from '../core/TempNode.js';
-import { cameraProjectionMatrix } from './CameraNode.js';
+import { cameraProjectionMatrix } from './Camera.js';
 import { modelViewMatrix } from './ModelNode.js';
-import { positionLocal } from './PositionNode.js';
-import { nodeProxy } from '../shadernode/ShaderNode.js';
-import { varying } from '../core/VaryingNode.js';
+import { positionLocal } from './Position.js';
+import { nodeProxy, varying } from '../tsl/TSLBase.js';
 
 class ModelViewProjectionNode extends TempNode {
 
@@ -34,6 +33,6 @@ class ModelViewProjectionNode extends TempNode {
 
 export default ModelViewProjectionNode;
 
-export const modelViewProjection = nodeProxy( ModelViewProjectionNode );
+registerNodeClass( 'ModelViewProjection', ModelViewProjectionNode );
 
-addNodeClass( 'ModelViewProjectionNode', ModelViewProjectionNode );
+export const modelViewProjection = nodeProxy( ModelViewProjectionNode );

+ 7 - 7
src/nodes/accessors/MorphNode.js

@@ -1,13 +1,13 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { NodeUpdateType } from '../core/constants.js';
-import { float, nodeProxy, Fn } from '../shadernode/ShaderNode.js';
+import { float, nodeProxy, Fn } from '../tsl/TSLBase.js';
 import { uniform } from '../core/UniformNode.js';
 import { reference } from './ReferenceNode.js';
-import { positionLocal } from './PositionNode.js';
-import { normalLocal } from './NormalNode.js';
+import { positionLocal } from './Position.js';
+import { normalLocal } from './Normal.js';
 import { textureLoad } from './TextureNode.js';
 import { instanceIndex, vertexIndex } from '../core/IndexNode.js';
-import { ivec2, int } from '../shadernode/ShaderNode.js';
+import { ivec2, int } from '../tsl/TSLBase.js';
 import { Loop } from '../utils/LoopNode.js';
 
 import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
@@ -254,6 +254,6 @@ class MorphNode extends Node {
 
 export default MorphNode;
 
-export const morphReference = nodeProxy( MorphNode );
+registerNodeClass( 'Morph', MorphNode );
 
-addNodeClass( 'MorphNode', MorphNode );
+export const morphReference = nodeProxy( MorphNode );

+ 4 - 5
src/nodes/accessors/NormalNode.js → src/nodes/accessors/Normal.js

@@ -1,10 +1,9 @@
 import { attribute } from '../core/AttributeNode.js';
-import { varying } from '../core/VaryingNode.js';
-import { cameraViewMatrix } from './CameraNode.js';
+import { cameraViewMatrix } from './Camera.js';
 import { modelNormalMatrix } from './ModelNode.js';
-import { vec3 } from '../shadernode/ShaderNode.js';
-import { positionView } from './PositionNode.js';
-import { Fn } from '../shadernode/ShaderNode.js';
+import { vec3 } from '../tsl/TSLBase.js';
+import { positionView } from './Position.js';
+import { Fn, varying } from '../tsl/TSLBase.js';
 import { faceDirection } from '../display/FrontFacingNode.js';
 
 export const normalGeometry = /*#__PURE__*/ attribute( 'normal', 'vec3' );

+ 4 - 4
src/nodes/accessors/Object3DNode.js

@@ -1,7 +1,7 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { NodeUpdateType } from '../core/constants.js';
 import UniformNode from '../core/UniformNode.js';
-import { nodeProxy } from '../shadernode/ShaderNode.js';
+import { nodeProxy } from '../tsl/TSLBase.js';
 
 import { Vector3 } from '../../math/Vector3.js';
 
@@ -139,6 +139,8 @@ Object3DNode.DIRECTION = 'direction';
 
 export default Object3DNode;
 
+registerNodeClass( 'Object3D', Object3DNode );
+
 export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION );
 export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX );
 export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX );
@@ -146,5 +148,3 @@ export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MAT
 export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION );
 export const objectScale = nodeProxy( Object3DNode, Object3DNode.SCALE );
 export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION );
-
-addNodeClass( 'Object3DNode', Object3DNode );

+ 4 - 4
src/nodes/accessors/PointUVNode.js

@@ -1,5 +1,5 @@
-import Node, { addNodeClass } from '../core/Node.js';
-import { nodeImmutable } from '../shadernode/ShaderNode.js';
+import Node, { registerNodeClass } from '../core/Node.js';
+import { nodeImmutable } from '../tsl/TSLBase.js';
 
 class PointUVNode extends Node {
 
@@ -21,6 +21,6 @@ class PointUVNode extends Node {
 
 export default PointUVNode;
 
-export const pointUV = nodeImmutable( PointUVNode );
+registerNodeClass( 'PointUV', PointUVNode );
 
-addNodeClass( 'PointUVNode', PointUVNode );
+export const pointUV = nodeImmutable( PointUVNode );

+ 10 - 0
src/nodes/accessors/Position.js

@@ -0,0 +1,10 @@
+import { attribute } from '../core/AttributeNode.js';
+import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
+
+export const positionGeometry = /*#__PURE__*/ attribute( 'position', 'vec3' );
+export const positionLocal = /*#__PURE__*/ positionGeometry.varying( 'positionLocal' );
+export const positionPrevious = /*#__PURE__*/ positionGeometry.varying( 'positionPrevious' );
+export const positionWorld = /*#__PURE__*/ modelWorldMatrix.mul( positionLocal ).xyz.varying( 'v_positionWorld' );
+export const positionWorldDirection = /*#__PURE__*/ positionLocal.transformDirection( modelWorldMatrix ).varying( 'v_positionWorldDirection' ).normalize().toVar( 'positionWorldDirection' );
+export const positionView = /*#__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' );
+export const positionViewDirection = /*#__PURE__*/ positionView.negate().varying( 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' );

+ 0 - 11
src/nodes/accessors/PositionNode.js

@@ -1,11 +0,0 @@
-import { attribute } from '../core/AttributeNode.js';
-import { varying } from '../core/VaryingNode.js';
-import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
-
-export const positionGeometry = /*#__PURE__*/ attribute( 'position', 'vec3' );
-export const positionLocal = /*#__PURE__*/ positionGeometry.varying( 'positionLocal' );
-export const positionPrevious = /*#__PURE__*/ positionGeometry.varying( 'positionPrevious' );
-export const positionWorld = /*#__PURE__*/ varying( modelWorldMatrix.mul( positionLocal ).xyz, 'v_positionWorld' );
-export const positionWorldDirection = /*#__PURE__*/ varying( positionLocal.transformDirection( modelWorldMatrix ), 'v_positionWorldDirection' ).normalize().toVar( 'positionWorldDirection' );
-export const positionView = /*#__PURE__*/ varying( modelViewMatrix.mul( positionLocal ).xyz, 'v_positionView' );
-export const positionViewDirection = /*#__PURE__*/ varying( positionView.negate(), 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' );

+ 143 - 0
src/nodes/accessors/ReferenceBaseNode.js

@@ -0,0 +1,143 @@
+import Node, { registerNodeClass } from '../core/Node.js';
+import { NodeUpdateType } from '../core/constants.js';
+import { uniform } from '../core/UniformNode.js';
+import { nodeObject } from '../tsl/TSLCore.js';
+import ArrayElementNode from '../utils/ArrayElementNode.js';
+
+class ReferenceElementNode extends ArrayElementNode {
+
+	constructor( referenceNode, indexNode ) {
+
+		super( referenceNode, indexNode );
+
+		this.referenceNode = referenceNode;
+
+		this.isReferenceElementNode = true;
+
+	}
+
+	getNodeType() {
+
+		return this.referenceNode.uniformType;
+
+	}
+
+	generate( builder ) {
+
+		const snippet = super.generate( builder );
+		const arrayType = this.referenceNode.getNodeType();
+		const elementType = this.getNodeType();
+
+		return builder.format( snippet, arrayType, elementType );
+
+	}
+
+}
+
+class ReferenceBaseNode extends Node {
+
+	constructor( property, uniformType, object = null, count = null ) {
+
+		super();
+
+		this.property = property;
+		this.uniformType = uniformType;
+		this.object = object;
+		this.count = count;
+
+		this.properties = property.split( '.' );
+		this.reference = object;
+		this.node = null;
+
+		this.updateType = NodeUpdateType.OBJECT;
+
+	}
+
+	element( indexNode ) {
+
+		return nodeObject( new ReferenceElementNode( this, nodeObject( indexNode ) ) );
+
+	}
+
+	setNodeType( uniformType ) {
+
+		this.node = uniform( null, uniformType ).getSelf();
+
+	}
+
+	getNodeType( builder ) {
+
+		if ( this.node === null ) {
+
+			this.updateValue();
+
+		}
+
+		return this.node.getNodeType( builder );
+
+	}
+
+	getValueFromReference( object = this.reference ) {
+
+		const { properties } = this;
+
+		let value = object[ properties[ 0 ] ];
+
+		for ( let i = 1; i < properties.length; i ++ ) {
+
+			value = value[ properties[ i ] ];
+
+		}
+
+		return value;
+
+	}
+
+	updateReference( state ) {
+
+		this.reference = this.object !== null ? this.object : state.object;
+
+		return this.reference;
+
+	}
+
+	setup() {
+
+		this.updateValue();
+
+		return this.node;
+
+	}
+
+	update( /*frame*/ ) {
+
+		this.updateValue();
+
+	}
+
+	updateValue() {
+
+		if ( this.node === null ) this.setNodeType( this.uniformType );
+
+		const value = this.getValueFromReference();
+
+		if ( Array.isArray( value ) ) {
+
+			this.node.array = value;
+
+		} else {
+
+			this.node.value = value;
+
+		}
+
+	}
+
+}
+
+export default ReferenceBaseNode;
+
+registerNodeClass( 'ReferenceBase', ReferenceBaseNode );
+
+export const reference = ( name, type, object ) => nodeObject( new ReferenceBaseNode( name, type, object ) );
+export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceBaseNode( name, type, object, count ) );

+ 5 - 4
src/nodes/accessors/ReferenceNode.js

@@ -1,10 +1,10 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { uniform } from '../core/UniformNode.js';
 import { texture } from './TextureNode.js';
 import { cubeTexture } from './CubeTextureNode.js';
 import { buffer } from './BufferNode.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 import { uniformArray } from './UniformArrayNode.js';
 import ArrayElementNode from '../utils/ArrayElementNode.js';
 
@@ -38,6 +38,7 @@ class ReferenceElementNode extends ArrayElementNode {
 
 }
 
+// TODO: Extends this from ReferenceBaseNode
 class ReferenceNode extends Node {
 
 	constructor( property, uniformType, object = null, count = null ) {
@@ -165,7 +166,7 @@ class ReferenceNode extends Node {
 
 export default ReferenceNode;
 
+registerNodeClass( 'Reference', ReferenceNode );
+
 export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
 export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceNode( name, type, object, count ) );
-
-addNodeClass( 'ReferenceNode', ReferenceNode );

+ 3 - 3
src/nodes/accessors/ReflectVectorNode.js → src/nodes/accessors/ReflectVector.js

@@ -1,6 +1,6 @@
-import { cameraViewMatrix } from './CameraNode.js';
-import { transformedNormalView } from './NormalNode.js';
-import { positionViewDirection } from './PositionNode.js';
+import { cameraViewMatrix } from './Camera.js';
+import { transformedNormalView } from './Normal.js';
+import { positionViewDirection } from './Position.js';
 import { materialRefractionRatio } from './MaterialProperties.js';
 
 export const reflectView = /*#__PURE__*/ positionViewDirection.negate().reflect( transformedNormalView );

+ 6 - 6
src/nodes/accessors/RendererReferenceNode.js

@@ -1,8 +1,8 @@
-import ReferenceNode from './ReferenceNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { registerNodeClass } from '../core/Node.js';
+import ReferenceBaseNode from './ReferenceBaseNode.js';
+import { nodeObject } from '../tsl/TSLCore.js';
 
-class RendererReferenceNode extends ReferenceNode {
+class RendererReferenceNode extends ReferenceBaseNode {
 
 	constructor( property, inputType, renderer = null ) {
 
@@ -24,6 +24,6 @@ class RendererReferenceNode extends ReferenceNode {
 
 export default RendererReferenceNode;
 
-export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );
+registerNodeClass( 'RendererReference', RendererReferenceNode );
 
-addNodeClass( 'RendererReferenceNode', RendererReferenceNode );
+export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );

+ 4 - 5
src/nodes/accessors/SceneNode.js

@@ -1,6 +1,5 @@
-import Node from '../core/Node.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeImmutable } from '../shadernode/ShaderNode.js';
+import Node, { registerNodeClass } from '../core/Node.js';
+import { nodeImmutable } from '../tsl/TSLBase.js';
 import { reference } from './ReferenceNode.js';
 
 class SceneNode extends Node {
@@ -46,7 +45,7 @@ SceneNode.BACKGROUND_INTENSITY = 'backgroundIntensity';
 
 export default SceneNode;
 
+registerNodeClass( 'Scene', SceneNode );
+
 export const backgroundBlurriness = nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );
 export const backgroundIntensity = nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );
-
-addNodeClass( 'SceneNode', SceneNode );

+ 7 - 7
src/nodes/accessors/SkinningNode.js

@@ -1,12 +1,12 @@
-import Node, { addNodeClass } from '../core/Node.js';
+import Node, { registerNodeClass } from '../core/Node.js';
 import { NodeUpdateType } from '../core/constants.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 import { attribute } from '../core/AttributeNode.js';
 import { reference, referenceBuffer } from './ReferenceNode.js';
 import { add } from '../math/OperatorNode.js';
-import { normalLocal } from './NormalNode.js';
-import { positionLocal, positionPrevious } from './PositionNode.js';
-import { tangentLocal } from './TangentNode.js';
+import { normalLocal } from './Normal.js';
+import { positionLocal, positionPrevious } from './Position.js';
+import { tangentLocal } from './Tangent.js';
 import { uniform } from '../core/UniformNode.js';
 import { buffer } from './BufferNode.js';
 
@@ -181,7 +181,7 @@ class SkinningNode extends Node {
 
 export default SkinningNode;
 
+registerNodeClass( 'Skinning', SkinningNode );
+
 export const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) );
 export const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) );
-
-addNodeClass( 'SkinningNode', SkinningNode );

+ 4 - 5
src/nodes/accessors/StorageBufferNode.js

@@ -1,8 +1,7 @@
+import { registerNodeClass } from '../core/Node.js';
 import BufferNode from './BufferNode.js';
 import { bufferAttribute } from './BufferAttributeNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
-import { varying } from '../core/VaryingNode.js';
+import { nodeObject, varying } from '../tsl/TSLBase.js';
 import { storageElement } from '../utils/StorageArrayElementNode.js';
 import { GPUBufferBindingType } from '../../renderers/webgpu/utils/WebGPUConstants.js';
 
@@ -123,8 +122,8 @@ class StorageBufferNode extends BufferNode {
 
 export default StorageBufferNode;
 
+registerNodeClass( 'StorageBuffer', StorageBufferNode );
+
 // Read-Write Storage
 export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
 export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
-
-addNodeClass( 'StorageBufferNode', StorageBufferNode );

+ 4 - 4
src/nodes/accessors/StorageTextureNode.js

@@ -1,6 +1,6 @@
-import { addNodeClass } from '../core/Node.js';
+import { registerNodeClass } from '../core/Node.js';
 import TextureNode from './TextureNode.js';
-import { nodeProxy } from '../shadernode/ShaderNode.js';
+import { nodeProxy } from '../tsl/TSLBase.js';
 import { GPUStorageTextureAccess } from '../../renderers/webgpu/utils/WebGPUConstants.js';
 
 class StorageTextureNode extends TextureNode {
@@ -89,6 +89,8 @@ class StorageTextureNode extends TextureNode {
 
 export default StorageTextureNode;
 
+registerNodeClass( 'StorageTexture', StorageTextureNode );
+
 export const storageTexture = nodeProxy( StorageTextureNode );
 
 export const textureStore = ( value, uvNode, storeNode ) => {
@@ -100,5 +102,3 @@ export const textureStore = ( value, uvNode, storeNode ) => {
 	return node;
 
 };
-
-addNodeClass( 'StorageTextureNode', StorageTextureNode );

+ 4 - 5
src/nodes/accessors/TangentNode.js → src/nodes/accessors/Tangent.js

@@ -1,8 +1,7 @@
 import { attribute } from '../core/AttributeNode.js';
-import { varying } from '../core/VaryingNode.js';
-import { cameraViewMatrix } from './CameraNode.js';
+import { cameraViewMatrix } from './Camera.js';
 import { modelViewMatrix } from './ModelNode.js';
-import { Fn, vec4 } from '../shadernode/ShaderNode.js';
+import { Fn, vec4 } from '../tsl/TSLBase.js';
 
 export const tangentGeometry = /*#__PURE__*/ Fn( ( builder ) => {
 
@@ -17,7 +16,7 @@ export const tangentGeometry = /*#__PURE__*/ Fn( ( builder ) => {
 } )();
 
 export const tangentLocal = /*#__PURE__*/ tangentGeometry.xyz.toVar( 'tangentLocal' );
-export const tangentView = /*#__PURE__*/ varying( modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz, 'v_tangentView' ).normalize().toVar( 'tangentView' );
-export const tangentWorld = /*#__PURE__*/ varying( tangentView.transformDirection( cameraViewMatrix ), 'v_tangentWorld' ).normalize().toVar( 'tangentWorld' );
+export const tangentView = /*#__PURE__*/ modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz.varying( 'v_tangentView' ).normalize().toVar( 'tangentView' );
+export const tangentWorld = /*#__PURE__*/ tangentView.transformDirection( cameraViewMatrix ).varying( 'v_tangentWorld' ).normalize().toVar( 'tangentWorld' );
 export const transformedTangentView = /*#__PURE__*/ tangentView.toVar( 'transformedTangentView' );
 export const transformedTangentWorld = /*#__PURE__*/ transformedTangentView.transformDirection( cameraViewMatrix ).normalize().toVar( 'transformedTangentWorld' );

+ 4 - 4
src/nodes/accessors/Texture3DNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import TextureNode from './TextureNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeProxy, vec3, Fn, If } from '../shadernode/ShaderNode.js';
+import { nodeProxy, vec3, Fn, If } from '../tsl/TSLBase.js';
 
 const normal = Fn( ( { texture, uv } ) => {
 
@@ -95,6 +95,6 @@ class Texture3DNode extends TextureNode {
 
 export default Texture3DNode;
 
-export const texture3D = nodeProxy( Texture3DNode );
+registerNodeClass( 'Texture3D', Texture3DNode );
 
-addNodeClass( 'Texture3DNode', Texture3DNode );
+export const texture3D = nodeProxy( Texture3DNode );

+ 3 - 32
src/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js

@@ -1,8 +1,6 @@
-import TempNode from '../core/TempNode.js';
-import { addNodeClass } from '../core/Node.js';
 import { add, mul, div } from '../math/OperatorNode.js';
 import { floor, ceil, fract, pow } from '../math/MathNode.js';
-import { nodeProxy, addNodeElement, float, vec2, vec4, int } from '../shadernode/ShaderNode.js';
+import { Fn, float, vec2, vec4, int } from '../tsl/TSLBase.js';
 
 // Mipped Bicubic Texture Filtering by N8
 // https://www.shadertoy.com/view/Dl2SDW
@@ -53,7 +51,7 @@ const bicubic = ( textureNode, texelSize, lod ) => {
 
 };
 
-const textureBicubicMethod = ( textureNode, lodNode ) => {
+export const textureBicubic = Fn( ( [ textureNode, lodNode = float( 3 ) ] ) => {
 
 	const fLodSize = vec2( textureNode.size( int( lodNode ) ) );
 	const cLodSize = vec2( textureNode.size( int( lodNode.add( 1.0 ) ) ) );
@@ -64,31 +62,4 @@ const textureBicubicMethod = ( textureNode, lodNode ) => {
 
 	return fract( lodNode ).mix( fSample, cSample );
 
-};
-
-class TextureBicubicNode extends TempNode {
-
-	constructor( textureNode, blurNode = float( 3 ) ) {
-
-		super( 'vec4' );
-
-		this.textureNode = textureNode;
-		this.blurNode = blurNode;
-
-	}
-
-	setup() {
-
-		return textureBicubicMethod( this.textureNode, this.blurNode );
-
-	}
-
-}
-
-export default TextureBicubicNode;
-
-export const textureBicubic = nodeProxy( TextureBicubicNode );
-
-addNodeElement( 'bicubic', textureBicubic );
-
-addNodeClass( 'TextureBicubicNode', TextureBicubicNode );
+} );

+ 5 - 8
src/nodes/accessors/TextureNode.js

@@ -1,11 +1,11 @@
+import { registerNodeClass } from '../core/Node.js';
 import UniformNode, { uniform } from '../core/UniformNode.js';
-import { uv } from './UVNode.js';
+import { uv } from './UV.js';
 import { textureSize } from './TextureSizeNode.js';
 import { colorSpaceToLinear } from '../display/ColorSpaceNode.js';
 import { expression } from '../code/ExpressionNode.js';
-import { addNodeClass } from '../core/Node.js';
 import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
-import { addNodeElement, nodeProxy, vec3, nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeProxy, vec3, nodeObject } from '../tsl/TSLBase.js';
 import { NodeUpdateType } from '../core/constants.js';
 
 import { IntType, UnsignedIntType } from '../../constants.js';
@@ -430,14 +430,11 @@ class TextureNode extends UniformNode {
 
 export default TextureNode;
 
+registerNodeClass( 'Texture', TextureNode );
+
 export const texture = nodeProxy( TextureNode );
 export const textureLoad = ( ...params ) => texture( ...params ).setSampler( false );
 
 //export const textureLevel = ( value, uv, level ) => texture( value, uv ).level( level );
 
 export const sampler = ( aTexture ) => ( aTexture.isNode === true ? aTexture : texture( aTexture ) ).convert( 'sampler' );
-
-addNodeElement( 'texture', texture );
-//addNodeElement( 'textureLevel', textureLevel );
-
-addNodeClass( 'TextureNode', TextureNode );

+ 4 - 6
src/nodes/accessors/TextureSizeNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import Node from '../core/Node.js';
-import { addNodeClass } from '../core/Node.js';
-import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
+import { nodeProxy } from '../tsl/TSLBase.js';
 
 class TextureSizeNode extends Node {
 
@@ -28,8 +28,6 @@ class TextureSizeNode extends Node {
 
 export default TextureSizeNode;
 
-export const textureSize = nodeProxy( TextureSizeNode );
-
-addNodeElement( 'textureSize', textureSize );
+registerNodeClass( 'TextureSize', TextureSizeNode );
 
-addNodeClass( 'TextureSizeNode', TextureSizeNode );
+export const textureSize = nodeProxy( TextureSizeNode );

+ 0 - 0
src/nodes/accessors/UVNode.js → src/nodes/accessors/UV.js


+ 4 - 4
src/nodes/accessors/UniformArrayNode.js

@@ -1,5 +1,5 @@
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { registerNodeClass } from '../core/Node.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { getValueType } from '../core/NodeUtils.js';
 import ArrayElementNode from '../utils/ArrayElementNode.js';
@@ -141,9 +141,9 @@ class UniformArrayNode extends BufferNode {
 
 export default UniformArrayNode;
 
-export const uniformArray = ( values, nodeType ) => nodeObject( new UniformArrayNode( values, nodeType ) );
+registerNodeClass( 'UniformArray', UniformArrayNode );
 
-addNodeClass( 'UniformArrayNode', UniformArrayNode );
+export const uniformArray = ( values, nodeType ) => nodeObject( new UniformArrayNode( values, nodeType ) );
 
 //
 

+ 4 - 4
src/nodes/accessors/UserDataNode.js

@@ -1,6 +1,6 @@
+import { registerNodeClass } from '../core/Node.js';
 import ReferenceNode from './ReferenceNode.js';
-import { addNodeClass } from '../core/Node.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 
 class UserDataNode extends ReferenceNode {
 
@@ -24,6 +24,6 @@ class UserDataNode extends ReferenceNode {
 
 export default UserDataNode;
 
-export const userData = ( name, inputType, userData ) => nodeObject( new UserDataNode( name, inputType, userData ) );
+registerNodeClass( 'UserData', UserDataNode );
 
-addNodeClass( 'UserDataNode', UserDataNode );
+export const userData = ( name, inputType, userData ) => nodeObject( new UserDataNode( name, inputType, userData ) );

+ 6 - 6
src/nodes/accessors/VelocityNode.js

@@ -1,13 +1,13 @@
-import { addNodeClass } from '../core/Node.js';
+import { registerNodeClass } from '../core/Node.js';
 import TempNode from '../core/TempNode.js';
 import { modelViewMatrix } from './ModelNode.js';
-import { positionLocal, positionPrevious } from './PositionNode.js';
-import { nodeImmutable } from '../shadernode/ShaderNode.js';
+import { positionLocal, positionPrevious } from './Position.js';
+import { nodeImmutable } from '../tsl/TSLBase.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { Matrix4 } from '../../math/Matrix4.js';
 import { uniform } from '../core/UniformNode.js';
 import { sub } from '../math/OperatorNode.js';
-import { cameraProjectionMatrix } from './CameraNode.js';
+import { cameraProjectionMatrix } from './Camera.js';
 
 const _matrixCache = new WeakMap();
 
@@ -78,6 +78,6 @@ function getPreviousMatrix( object ) {
 
 export default VelocityNode;
 
-export const velocity = nodeImmutable( VelocityNode );
+registerNodeClass( 'Velocity', VelocityNode );
 
-addNodeClass( 'VelocityNode', VelocityNode );
+export const velocity = nodeImmutable( VelocityNode );

+ 4 - 4
src/nodes/accessors/VertexColorNode.js

@@ -1,6 +1,6 @@
-import { addNodeClass } from '../core/Node.js';
+import { registerNodeClass } from '../core/Node.js';
 import AttributeNode from '../core/AttributeNode.js';
-import { nodeObject } from '../shadernode/ShaderNode.js';
+import { nodeObject } from '../tsl/TSLBase.js';
 
 import { Vector4 } from '../../math/Vector4.js';
 
@@ -66,6 +66,6 @@ class VertexColorNode extends AttributeNode {
 
 export default VertexColorNode;
 
-export const vertexColor = ( ...params ) => nodeObject( new VertexColorNode( ...params ) );
+registerNodeClass( 'VertexColor', VertexColorNode );
 
-addNodeClass( 'VertexColorNode', VertexColorNode );
+export const vertexColor = ( ...params ) => nodeObject( new VertexColorNode( ...params ) );

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác

粤ICP备19079148号