ShaderNodeElements.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // core nodes
  2. import PropertyNode from '../core/PropertyNode.js';
  3. import VarNode from '../core/VarNode.js';
  4. import AttributeNode from '../core/AttributeNode.js';
  5. import UniformNode from '../core/UniformNode.js';
  6. import BypassNode from '../core/BypassNode.js';
  7. import InstanceIndexNode from '../core/InstanceIndexNode.js';
  8. import ContextNode from '../core/ContextNode.js';
  9. // accessor nodes
  10. import BufferNode from '../accessors/BufferNode.js';
  11. import CameraNode from '../accessors/CameraNode.js';
  12. import MaterialNode from '../accessors/MaterialNode.js';
  13. import ModelNode from '../accessors/ModelNode.js';
  14. import ModelViewProjectionNode from '../accessors/ModelViewProjectionNode.js';
  15. import NormalNode from '../accessors/NormalNode.js';
  16. import PositionNode from '../accessors/PositionNode.js';
  17. import SkinningNode from '../accessors/SkinningNode.js';
  18. import TextureNode from '../accessors/TextureNode.js';
  19. import UVNode from '../accessors/UVNode.js';
  20. import InstanceNode from '../accessors/InstanceNode.js';
  21. // math nodes
  22. import OperatorNode from '../math/OperatorNode.js';
  23. import CondNode from '../math/CondNode.js';
  24. import MathNode from '../math/MathNode.js';
  25. // util nodes
  26. import ArrayElementNode from '../utils/ArrayElementNode.js';
  27. import ConvertNode from '../utils/ConvertNode.js';
  28. import JoinNode from '../utils/JoinNode.js';
  29. // other nodes
  30. import ColorSpaceNode from '../display/ColorSpaceNode.js';
  31. import LightContextNode from '../lights/LightContextNode.js';
  32. import ReflectedLightNode from '../lights/ReflectedLightNode.js';
  33. // utils
  34. import ShaderNode from './ShaderNode.js';
  35. import { nodeObject, nodeObjects, nodeArray, nodeProxy, ConvertType, cacheMaps } from './ShaderNodeUtils.js';
  36. //
  37. // Node Material Shader Syntax
  38. //
  39. export { ShaderNode, nodeObject, nodeObjects, nodeArray, nodeProxy };
  40. export const color = new ConvertType( 'color' );
  41. export const float = new ConvertType( 'float', cacheMaps.float );
  42. export const int = new ConvertType( 'int', cacheMaps.int );
  43. export const uint = new ConvertType( 'uint', cacheMaps.uint );
  44. export const bool = new ConvertType( 'bool', cacheMaps.bool );
  45. export const vec2 = new ConvertType( 'vec2' );
  46. export const ivec2 = new ConvertType( 'ivec2' );
  47. export const uvec2 = new ConvertType( 'uvec2' );
  48. export const bvec2 = new ConvertType( 'bvec2' );
  49. export const vec3 = new ConvertType( 'vec3' );
  50. export const ivec3 = new ConvertType( 'ivec3' );
  51. export const uvec3 = new ConvertType( 'uvec3' );
  52. export const bvec3 = new ConvertType( 'bvec3' );
  53. export const vec4 = new ConvertType( 'vec4' );
  54. export const ivec4 = new ConvertType( 'ivec4' );
  55. export const uvec4 = new ConvertType( 'uvec4' );
  56. export const bvec4 = new ConvertType( 'bvec4' );
  57. export const mat3 = new ConvertType( 'mat3' );
  58. export const imat3 = new ConvertType( 'imat3' );
  59. export const umat3 = new ConvertType( 'umat3' );
  60. export const bmat3 = new ConvertType( 'bmat3' );
  61. export const mat4 = new ConvertType( 'mat4' );
  62. export const imat4 = new ConvertType( 'imat4' );
  63. export const umat4 = new ConvertType( 'umat4' );
  64. export const bmat4 = new ConvertType( 'bmat4' );
  65. export const uniform = ( value ) => {
  66. // TODO: get ConstNode from .traverse() in the future
  67. value = value.isNode === true ? value.node?.value || value.value : value;
  68. return nodeObject( new UniformNode( value, value.nodeType ) );
  69. };
  70. export const label = ( node, name ) => {
  71. node = nodeObject( node );
  72. if ( ( node.isVarNode === true ) && ( node.name === name ) ) {
  73. return node;
  74. }
  75. return nodeObject( new VarNode( node, name ) );
  76. };
  77. export const temp = nodeProxy( VarNode );
  78. export const join = ( ...params ) => nodeObject( new JoinNode( nodeArray( params ) ) );
  79. export const uv = ( ...params ) => nodeObject( new UVNode( ...params ) );
  80. export const attribute = ( ...params ) => nodeObject( new AttributeNode( ...params ) );
  81. export const buffer = ( ...params ) => nodeObject( new BufferNode( ...params ) );
  82. export const texture = ( ...params ) => nodeObject( new TextureNode( ...params ) );
  83. export const sampler = ( texture ) => nodeObject( new ConvertNode( texture.isNode === true ? texture : new TextureNode( texture ), 'sampler' ) );
  84. export const cond = nodeProxy( CondNode );
  85. export const add = nodeProxy( OperatorNode, '+' );
  86. export const sub = nodeProxy( OperatorNode, '-' );
  87. export const mul = nodeProxy( OperatorNode, '*' );
  88. export const div = nodeProxy( OperatorNode, '/' );
  89. export const remainder = nodeProxy( OperatorNode, '%' );
  90. export const equal = nodeProxy( OperatorNode, '==' );
  91. export const assign = nodeProxy( OperatorNode, '=' );
  92. export const lessThan = nodeProxy( OperatorNode, '<' );
  93. export const greaterThan = nodeProxy( OperatorNode, '>' );
  94. export const lessThanEqual = nodeProxy( OperatorNode, '<=' );
  95. export const greaterThanEqual = nodeProxy( OperatorNode, '>=' );
  96. export const and = nodeProxy( OperatorNode, '&&' );
  97. export const or = nodeProxy( OperatorNode, '||' );
  98. export const xor = nodeProxy( OperatorNode, '^^' );
  99. export const bitAnd = nodeProxy( OperatorNode, '&' );
  100. export const bitOr = nodeProxy( OperatorNode, '|' );
  101. export const bitXor = nodeProxy( OperatorNode, '^' );
  102. export const shiftLeft = nodeProxy( OperatorNode, '<<' );
  103. export const shiftRight = nodeProxy( OperatorNode, '>>' );
  104. export const element = nodeProxy( ArrayElementNode );
  105. export const instanceIndex = nodeObject( new InstanceIndexNode() );
  106. export const modelViewProjection = nodeProxy( ModelViewProjectionNode );
  107. export const normalGeometry = nodeObject( new NormalNode( NormalNode.GEOMETRY ) );
  108. export const normalLocal = nodeObject( new NormalNode( NormalNode.LOCAL ) );
  109. export const normalWorld = nodeObject( new NormalNode( NormalNode.WORLD ) );
  110. export const normalView = nodeObject( new NormalNode( NormalNode.VIEW ) );
  111. export const transformedNormalView = nodeObject( new VarNode( new NormalNode( NormalNode.VIEW ), 'TransformedNormalView', 'vec3' ) );
  112. export const positionGeometry = nodeObject( new PositionNode( PositionNode.GEOMETRY ) );
  113. export const positionLocal = nodeObject( new PositionNode( PositionNode.LOCAL ) );
  114. export const positionWorld = nodeObject( new PositionNode( PositionNode.WORLD ) );
  115. export const positionView = nodeObject( new PositionNode( PositionNode.VIEW ) );
  116. export const positionViewDirection = nodeObject( new PositionNode( PositionNode.VIEW_DIRECTION ) );
  117. export const viewMatrix = nodeObject( new ModelNode( ModelNode.VIEW_MATRIX ) );
  118. export const cameraPosition = nodeObject( new CameraNode( CameraNode.POSITION ) );
  119. export const diffuseColor = nodeObject( new PropertyNode( 'DiffuseColor', 'vec4' ) );
  120. export const roughness = nodeObject( new PropertyNode( 'Roughness', 'float' ) );
  121. export const metalness = nodeObject( new PropertyNode( 'Metalness', 'float' ) );
  122. export const alphaTest = nodeObject( new PropertyNode( 'AlphaTest', 'float' ) );
  123. export const specularColor = nodeObject( new PropertyNode( 'SpecularColor', 'color' ) );
  124. export const materialAlphaTest = nodeObject( new MaterialNode( MaterialNode.ALPHA_TEST ) );
  125. export const materialColor = nodeObject( new MaterialNode( MaterialNode.COLOR ) );
  126. export const materialOpacity = nodeObject( new MaterialNode( MaterialNode.OPACITY ) );
  127. export const materialSpecular = nodeObject( new MaterialNode( MaterialNode.SPECULAR ) );
  128. export const materialRoughness = nodeObject( new MaterialNode( MaterialNode.ROUGHNESS ) );
  129. export const materialMetalness = nodeObject( new MaterialNode( MaterialNode.METALNESS ) );
  130. export const skinning = nodeProxy( SkinningNode );
  131. export const instance = nodeProxy( InstanceNode );
  132. export const context = nodeProxy( ContextNode );
  133. export const lightContext = nodeProxy( LightContextNode );
  134. export const reflectedLight = nodeProxy( ReflectedLightNode );
  135. export const colorSpace = ( node, encoding ) => nodeObject( new ColorSpaceNode( null, nodeObject( node ) ).fromEncoding( encoding ) );
  136. export const bypass = nodeProxy( BypassNode );
  137. export const abs = nodeProxy( MathNode, 'abs' );
  138. export const acos = nodeProxy( MathNode, 'acos' );
  139. export const asin = nodeProxy( MathNode, 'asin' );
  140. export const atan = nodeProxy( MathNode, 'atan' );
  141. export const ceil = nodeProxy( MathNode, 'ceil' );
  142. export const clamp = nodeProxy( MathNode, 'clamp' );
  143. export const cos = nodeProxy( MathNode, 'cos' );
  144. export const cross = nodeProxy( MathNode, 'cross' );
  145. export const degrees = nodeProxy( MathNode, 'degrees' );
  146. export const dFdx = nodeProxy( MathNode, 'dFdx' );
  147. export const dFdy = nodeProxy( MathNode, 'dFdy' );
  148. export const distance = nodeProxy( MathNode, 'distance' );
  149. export const dot = nodeProxy( MathNode, 'dot' );
  150. export const exp = nodeProxy( MathNode, 'exp' );
  151. export const exp2 = nodeProxy( MathNode, 'exp2' );
  152. export const faceforward = nodeProxy( MathNode, 'faceforward' );
  153. export const floor = nodeProxy( MathNode, 'floor' );
  154. export const fract = nodeProxy( MathNode, 'fract' );
  155. export const invert = nodeProxy( MathNode, 'invert' );
  156. export const inversesqrt = nodeProxy( MathNode, 'inversesqrt' );
  157. export const length = nodeProxy( MathNode, 'length' );
  158. export const log = nodeProxy( MathNode, 'log' );
  159. export const log2 = nodeProxy( MathNode, 'log2' );
  160. export const max = nodeProxy( MathNode, 'max' );
  161. export const min = nodeProxy( MathNode, 'min' );
  162. export const mix = nodeProxy( MathNode, 'mix' );
  163. export const mod = nodeProxy( MathNode, 'mod' );
  164. export const negate = nodeProxy( MathNode, 'negate' );
  165. export const normalize = nodeProxy( MathNode, 'normalize' );
  166. export const pow = nodeProxy( MathNode, 'pow' );
  167. export const pow2 = nodeProxy( MathNode, 'pow', 2 );
  168. export const pow3 = nodeProxy( MathNode, 'pow', 3 );
  169. export const pow4 = nodeProxy( MathNode, 'pow', 4 );
  170. export const radians = nodeProxy( MathNode, 'radians' );
  171. export const reflect = nodeProxy( MathNode, 'reflect' );
  172. export const refract = nodeProxy( MathNode, 'refract' );
  173. export const round = nodeProxy( MathNode, 'round' );
  174. export const saturate = nodeProxy( MathNode, 'saturate' );
  175. export const sign = nodeProxy( MathNode, 'sign' );
  176. export const sin = nodeProxy( MathNode, 'sin' );
  177. export const smoothstep = nodeProxy( MathNode, 'smoothstep' );
  178. export const sqrt = nodeProxy( MathNode, 'sqrt' );
  179. export const step = nodeProxy( MathNode, 'step' );
  180. export const tan = nodeProxy( MathNode, 'tan' );
  181. export const transformDirection = nodeProxy( MathNode, 'transformDirection' );
  182. export const EPSILON = float( 1e-6 );
  183. export const INFINITY = float( 1e6 );
  184. export const dotNV = saturate( dot( transformedNormalView, positionViewDirection ) );