NodeKeywords.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import VarNode from './VarNode.js';
  2. import PropertyNode from './PropertyNode.js';
  3. import PositionNode from '../accessors/PositionNode.js';
  4. import NormalNode from '../accessors/NormalNode.js';
  5. class NodeKeywords {
  6. static PositionLocal = 'PositionLocal';
  7. static PositionWorld = 'PositionWorld';
  8. static PositionView = 'PositionView';
  9. static PositionViewDirection = 'PositionViewDirection';
  10. static NormalLocal = 'NormalLocal';
  11. static NormalWorld = 'NormalWorld';
  12. static NormalView = 'NormalView';
  13. static Irradiance = 'Irradiance';
  14. static ReflectedLightIndirectDiffuse = 'ReflectedLightIndirectDiffuse';
  15. static ReflectedLightIndirectSpecular = 'ReflectedLightIndirectSpecular';
  16. static ReflectedLightDirectDiffuse = 'ReflectedLightDirectDiffuse';
  17. static ReflectedLightDirectSpecular = 'ReflectedLightDirectSpecular';
  18. static MaterialDiffuseColor = 'MaterialDiffuseColor';
  19. // STANDARD
  20. static MaterialRoughness = 'MaterialRoughness';
  21. static MaterialMetalness = 'MaterialMetalness';
  22. static MaterialSpecularTint = 'MaterialSpecularTint';
  23. constructor() {
  24. this.keywords = [
  25. // nodes
  26. NodeKeywords.PositionLocal,
  27. NodeKeywords.PositionWorld,
  28. NodeKeywords.PositionView,
  29. NodeKeywords.PositionViewDirection,
  30. NodeKeywords.NormalLocal,
  31. NodeKeywords.NormalWorld,
  32. NodeKeywords.NormalView,
  33. // vars -> float
  34. NodeKeywords.MaterialRoughness,
  35. NodeKeywords.MaterialMetalness,
  36. // vars -> vec3
  37. NodeKeywords.Irradiance,
  38. NodeKeywords.ReflectedLightIndirectDiffuse,
  39. NodeKeywords.ReflectedLightIndirectSpecular,
  40. NodeKeywords.ReflectedLightDirectDiffuse,
  41. NodeKeywords.ReflectedLightDirectSpecular,
  42. NodeKeywords.MaterialSpecularTint,
  43. // vars -> vec4
  44. NodeKeywords.MaterialDiffuseColor
  45. ];
  46. this.nodes = [];
  47. this.keywordsCallback = {};
  48. }
  49. getNode( name ) {
  50. let node = this.nodes[ name ];
  51. if ( node === undefined ) {
  52. if ( this.keywordsCallback[ name ] !== undefined ) {
  53. node = this.keywordsCallback[ name ]( name );
  54. this.nodes[ name ] = node;
  55. return node;
  56. }
  57. switch ( name ) {
  58. case NodeKeywords.PositionLocal:
  59. node = new VarNode( new PositionNode( PositionNode.GEOMETRY ), name );
  60. break;
  61. case NodeKeywords.PositionWorld:
  62. node = new VarNode( new PositionNode( PositionNode.WORLD ), name );
  63. break;
  64. case NodeKeywords.PositionView:
  65. node = new VarNode( new PositionNode( PositionNode.VIEW ), name );
  66. break;
  67. case NodeKeywords.PositionViewDirection:
  68. node = new VarNode( new PositionNode( PositionNode.VIEW_DIRECTION ), name );
  69. break;
  70. case NodeKeywords.NormalLocal:
  71. node = new VarNode( new NormalNode( NormalNode.GEOMETRY ), name );
  72. break;
  73. case NodeKeywords.NormalWorld:
  74. node = new VarNode( new NormalNode( NormalNode.WORLD ), name );
  75. break;
  76. case NodeKeywords.NormalView:
  77. node = new VarNode( new NormalNode( NormalNode.VIEW ), name );
  78. break;
  79. // floats properties
  80. case NodeKeywords.MaterialRoughness:
  81. case NodeKeywords.MaterialMetalness:
  82. node = new PropertyNode( name, 'float' );
  83. break;
  84. // vec3 properties
  85. case NodeKeywords.Irradiance:
  86. case NodeKeywords.ReflectedLightIndirectDiffuse:
  87. case NodeKeywords.ReflectedLightIndirectSpecular:
  88. case NodeKeywords.ReflectedLightDirectDiffuse:
  89. case NodeKeywords.ReflectedLightDirectSpecular:
  90. case NodeKeywords.MaterialSpecularTint:
  91. node = new PropertyNode( name, 'vec3' );
  92. break;
  93. // vec4 properties
  94. case NodeKeywords.MaterialDiffuseColor:
  95. node = new PropertyNode( name, 'vec4' );
  96. break;
  97. }
  98. if ( node !== undefined ) {
  99. this.nodes[ name ] = node;
  100. }
  101. }
  102. return node;
  103. }
  104. addKeyword( name, callback ) {
  105. this.keywords.push( name );
  106. this.keywordsCallback[ name ] = callback;
  107. return this;
  108. }
  109. parse( code ) {
  110. const keywordNames = this.keywords;
  111. const regExp = new RegExp( `\\b${keywordNames.join( '\\b|\\b' )}\\b`, 'g' );
  112. const codeKeywords = code.match( regExp );
  113. const keywords = [];
  114. if ( codeKeywords !== null ) {
  115. for ( const keyword of codeKeywords ) {
  116. const node = this.getNode( keyword );
  117. if ( keywords.indexOf( node ) === - 1 ) {
  118. keywords.push( node );
  119. }
  120. }
  121. }
  122. return keywords;
  123. }
  124. include( builder, code ) {
  125. const keywords = this.parse( code );
  126. for ( const keywordNode of keywords ) {
  127. keywordNode.build( builder );
  128. }
  129. }
  130. }
  131. export default NodeKeywords;