123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- import VarNode from './VarNode.js';
- import PropertyNode from './PropertyNode.js';
- import PositionNode from '../accessors/PositionNode.js';
- import NormalNode from '../accessors/NormalNode.js';
- import { PI, RECIPROCAL_PI, EPSILON } from '../consts/MathConsts.js';
- import { saturateMacro, whiteComplementMacro } from '../functions/MathFunctions.js';
- class NodeKeywords {
- static PI = 'PI';
- static RECIPROCAL_PI = 'RECIPROCAL_PI';
- static EPSILON = 'EPSILON';
- static Saturate = 'saturate';
- static WhiteComplement = 'whiteComplement';
- static PositionLocal = 'PositionLocal';
- static PositionWorld = 'PositionWorld';
- static PositionView = 'PositionView';
- static PositionViewDirection = 'PositionViewDirection';
- static NormalLocal = 'NormalLocal';
- static NormalWorld = 'NormalWorld';
- static NormalView = 'NormalView';
- static Irradiance = 'Irradiance';
- static ReflectedLightIndirectDiffuse = 'ReflectedLightIndirectDiffuse';
- static ReflectedLightIndirectSpecular = 'ReflectedLightIndirectSpecular';
- static ReflectedLightDirectDiffuse = 'ReflectedLightDirectDiffuse';
- static ReflectedLightDirectSpecular = 'ReflectedLightDirectSpecular';
- static MaterialDiffuseColor = 'MaterialDiffuseColor';
- // STANDARD
- static MaterialRoughness = 'MaterialRoughness';
- static MaterialMetalness = 'MaterialMetalness';
- // PHONG
- static MaterialSpecularShininess = 'MaterialSpecularShininess';
- static MaterialSpecularColor = 'MaterialSpecularColor';
- constructor() {
- this.keywords = [
- // consts
- NodeKeywords.PI,
- NodeKeywords.RECIPROCAL_PI,
- NodeKeywords.EPSILON,
- // variadic macros
- NodeKeywords.Saturate,
- NodeKeywords.WhiteComplement,
- // nodes
- NodeKeywords.PositionLocal,
- NodeKeywords.PositionWorld,
- NodeKeywords.PositionView,
- NodeKeywords.PositionViewDirection,
- NodeKeywords.NormalLocal,
- NodeKeywords.NormalWorld,
- NodeKeywords.NormalView,
- // vars -> float
- NodeKeywords.MaterialSpecularShininess,
- NodeKeywords.MaterialRoughness,
- NodeKeywords.MaterialMetalness,
- // vars -> vec3
- NodeKeywords.Irradiance,
- NodeKeywords.ReflectedLightIndirectDiffuse,
- NodeKeywords.ReflectedLightIndirectSpecular,
- NodeKeywords.ReflectedLightDirectDiffuse,
- NodeKeywords.ReflectedLightDirectSpecular,
- NodeKeywords.MaterialSpecularColor,
- // vars -> vec4
- NodeKeywords.MaterialDiffuseColor
- ];
- this.nodes = [];
- }
- getNode( name ) {
- let node = this.nodes[ name ];
- if ( node === undefined ) {
- switch ( name ) {
- case NodeKeywords.PI:
- node = PI;
- break;
- case NodeKeywords.RECIPROCAL_PI:
- node = RECIPROCAL_PI;
- break;
- case NodeKeywords.EPSILON:
- node = EPSILON;
- break;
- case NodeKeywords.Saturate:
- node = saturateMacro;
- break;
- case NodeKeywords.WhiteComplement:
- node = whiteComplementMacro;
- break;
- case NodeKeywords.PositionLocal:
- node = new VarNode( new PositionNode( PositionNode.LOCAL ), name );
- break;
- case NodeKeywords.PositionWorld:
- node = new VarNode( new PositionNode( PositionNode.WORLD ), name );
- break;
- case NodeKeywords.PositionView:
- node = new VarNode( new PositionNode( PositionNode.VIEW ), name );
- break;
- case NodeKeywords.PositionViewDirection:
- node = new VarNode( new PositionNode( PositionNode.VIEW_DIRECTION ), name );
- break;
- case NodeKeywords.NormalLocal:
- node = new VarNode( new NormalNode( NormalNode.LOCAL ), name );
- break;
- case NodeKeywords.NormalWorld:
- node = new VarNode( new NormalNode( NormalNode.WORLD ), name );
- break;
- case NodeKeywords.NormalView:
- node = new VarNode( new NormalNode( NormalNode.VIEW ), name );
- break;
- // floats properties
- case NodeKeywords.MaterialSpecularShininess:
- case NodeKeywords.MaterialRoughness:
- case NodeKeywords.MaterialMetalness:
- node = new PropertyNode( name, 'float' );
- break;
- // vec3 properties
- case NodeKeywords.Irradiance:
- case NodeKeywords.ReflectedLightIndirectDiffuse:
- case NodeKeywords.ReflectedLightIndirectSpecular:
- case NodeKeywords.ReflectedLightDirectDiffuse:
- case NodeKeywords.ReflectedLightDirectSpecular:
- case NodeKeywords.MaterialSpecularColor:
- node = new PropertyNode( name, 'vec3' );
- break;
- // vec4 properties
- case NodeKeywords.MaterialDiffuseColor:
- node = new PropertyNode( name, 'vec4' );
- break;
- }
- if ( node !== undefined ) {
- this.nodes[ name ] = node;
- }
- }
- return node;
- }
- parse( code ) {
- const keywordNames = this.keywords;
- const regExp = new RegExp( `\\b${keywordNames.join( '\\b|\\b' )}\\b`, 'g' );
- const codeKeywords = code.match( regExp );
- const keywords = [];
- if ( codeKeywords !== null ) {
- for ( const keyword of codeKeywords ) {
- const node = this.getNode( keyword );
- if ( keywords.indexOf( node ) === - 1 ) {
- keywords.push( node );
- }
- }
- }
- return keywords;
- }
- include( builder, code ) {
- const keywords = this.parse( code );
- for ( const keywordNode of keywords ) {
- keywordNode.build( builder );
- }
- }
- }
- export default NodeKeywords;
|