NodeKeywords.js 4.7 KB

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