ShaderNode.js 3.4 KB

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