ShaderNode.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // inputs
  2. import ColorNode from './inputs/ColorNode.js';
  3. import FloatNode from './inputs/FloatNode.js';
  4. import Vector2Node from './inputs/Vector2Node.js';
  5. import Vector3Node from './inputs/Vector3Node.js';
  6. import Vector4Node from './inputs/Vector4Node.js';
  7. // math
  8. import MathNode from './math/MathNode.js';
  9. import OperatorNode from './math/OperatorNode.js';
  10. // utils
  11. import JoinNode from './utils/JoinNode.js';
  12. import SplitNode from './utils/SplitNode.js';
  13. // core
  14. import { Vector2, Vector3, Vector4, Color } from 'three';
  15. const NodeHandler = {
  16. construct( NodeClosure, params ) {
  17. return NodeClosure( params[ 0 ] );
  18. },
  19. get: function ( node, prop ) {
  20. // Split Properties Pass
  21. if ( typeof prop === 'string' && node[ prop ] === undefined ) {
  22. const splitProps = prop.match( /^[xyzw]{1,4}$/ );
  23. if ( splitProps !== null ) {
  24. return ShaderNodeObject( new SplitNode( node, splitProps[ 0 ] ) );
  25. }
  26. }
  27. return node[ prop ];
  28. }
  29. };
  30. const ShaderNodeObject = ( obj ) => {
  31. const type = typeof obj;
  32. if ( type === 'number' ) {
  33. return ShaderNodeObject( new FloatNode( obj ).setConst( true ) );
  34. } else if ( type === 'object' ) {
  35. if ( obj.isNode === true ) {
  36. const node = obj;
  37. if ( node.isProxyNode !== true ) {
  38. node.isProxyNode = true;
  39. return new Proxy( node, NodeHandler );
  40. }
  41. }
  42. }
  43. return obj;
  44. };
  45. const ShaderNodeArray = ( array ) => {
  46. const len = array.length;
  47. for ( let i = 0; i < len; i ++ ) {
  48. array[ i ] = ShaderNodeObject( array[ i ] );
  49. }
  50. return array;
  51. };
  52. const ShaderNodeScript = function ( jsFunc ) {
  53. return ( ...params ) => {
  54. ShaderNodeArray( params );
  55. return ShaderNodeObject( jsFunc( ...params ) );
  56. };
  57. };
  58. export const ShaderNode = new Proxy( ShaderNodeScript, NodeHandler );
  59. //
  60. // Node Material Shader Syntax
  61. //
  62. export const uniform = new ShaderNode( ( inputNode ) => {
  63. inputNode.setConst( false );
  64. return inputNode;
  65. } );
  66. export const float = ( val ) => {
  67. return ShaderNodeObject( new FloatNode( val ).setConst( true ) );
  68. };
  69. export const color = ( ...params ) => {
  70. return ShaderNodeObject( new ColorNode( new Color( ...params ) ).setConst( true ) );
  71. };
  72. export const join = ( ...params ) => {
  73. return ShaderNodeObject( new JoinNode( ShaderNodeArray( params ) ) );
  74. };
  75. export const vec2 = ( ...params ) => {
  76. return ShaderNodeObject( new Vector2Node( new Vector2( ...params ) ).setConst( true ) );
  77. };
  78. export const vec3 = ( ...params ) => {
  79. return ShaderNodeObject( new Vector3Node( new Vector3( ...params ) ).setConst( true ) );
  80. };
  81. export const vec4 = ( ...params ) => {
  82. return ShaderNodeObject( new Vector4Node( new Vector4( ...params ) ).setConst( true ) );
  83. };
  84. export const add = ( ...params ) => {
  85. return ShaderNodeObject( new OperatorNode( '+', ...ShaderNodeArray( params ) ) );
  86. };
  87. export const sub = ( ...params ) => {
  88. return new OperatorNode( '-', ...ShaderNodeArray( params ) );
  89. };
  90. export const mul = ( ...params ) => {
  91. return ShaderNodeObject( new OperatorNode( '*', ...ShaderNodeArray( params ) ) );
  92. };
  93. export const div = ( ...params ) => {
  94. return ShaderNodeObject( new OperatorNode( '/', ...ShaderNodeArray( params ) ) );
  95. };
  96. export const floor = ( ...params ) => {
  97. return ShaderNodeObject( new MathNode( 'floor', ...ShaderNodeArray( params ) ) );
  98. };
  99. export const mod = ( ...params ) => {
  100. return ShaderNodeObject( new MathNode( 'mod', ...ShaderNodeArray( params ) ) );
  101. };
  102. export const sign = ( ...params ) => {
  103. return ShaderNodeObject( new MathNode( 'sign', ...ShaderNodeArray( params ) ) );
  104. };