123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- const VERSION = '1';
- class NodeBuilder {
- constructor() {
-
- this.slots = { vertex: [], fragment: [] };
- this.defines = { vertex: {}, fragment: {} };
-
- this.nodesData = new WeakMap();
-
- this.shader = undefined;
-
- }
-
- setMaterial( material ) {
-
- this.material = material;
-
- }
-
- addSlot( shader, slot ) {
-
- this.slots[ shader ].push( slot );
-
- }
-
- addDefine( shader, name, value ) {
-
- this.defines[ shader ][ name ] = value || '';
-
- }
-
- generateVec3( x, y, z ) {
-
- return `vec3( ${x}, ${y}, ${z} )`;
-
- }
-
- generateFloat( value ) {
-
- return value + ( value % 1 ? '' : '.0' );
-
- }
- /*
- createDataFromNode( node ) {
-
- return this.nodesData[ node ] = this.nodesData[ node ] || {};
-
- }
- */
- createUniformFromNode( node ) {
-
-
-
- }
- /*
- analyzeNode( node ) {
-
-
- }
- */
- flowNode( node, output ) {
-
- let flowData = {};
- flowData.result = node.build( this, output );
-
- return flowData;
-
- }
-
- buildDefines( shader ) {
-
- const defines = this.defines[ shader ];
-
- let code = '';
-
- for ( let name in defines ) {
-
- code += `#define NODE_${name} ${defines[name]}\n`;
-
- }
-
- return code;
-
- }
-
- build( shader ) {
-
- const slots = this.slots[ shader ];
-
- if ( slots.length ) {
-
- this.addDefine( shader, 'NODE', VERSION );
-
- for( let i = 0; i < slots.length; i++) {
-
- let slot = slots[i];
-
- let flowData = this.flowNode( slot.node );
-
- this.addDefine( shader, slot.name, flowData.result );
-
- }
-
- }
-
- let defines = this.buildDefines( shader );
-
- return {
- defines
- };
-
- }
-
- format( code, fromType, toType ) {
- const typeToType = toType + ' <- ' + fromType;
- switch ( typeToType ) {
- case 'f <- v2' : return code + '.x';
- case 'f <- v3' : return code + '.x';
- case 'f <- v4' : return code + '.x';
- case 'f <- i' :
- case 'f <- b' : return 'float( ' + code + ' )';
- case 'v2 <- f' : return 'vec2( ' + code + ' )';
- case 'v2 <- v3': return code + '.xy';
- case 'v2 <- v4': return code + '.xy';
- case 'v2 <- i' :
- case 'v2 <- b' : return 'vec2( float( ' + code + ' ) )';
- case 'v3 <- f' : return 'vec3( ' + code + ' )';
- case 'v3 <- v2': return 'vec3( ' + code + ', 0.0 )';
- case 'v3 <- v4': return code + '.xyz';
- case 'v3 <- i' :
- case 'v3 <- b' : return 'vec2( float( ' + code + ' ) )';
- case 'v4 <- f' : return 'vec4( ' + code + ' )';
- case 'v4 <- v2': return 'vec4( ' + code + ', 0.0, 1.0 )';
- case 'v4 <- v3': return 'vec4( ' + code + ', 1.0 )';
- case 'v4 <- i' :
- case 'v4 <- b' : return 'vec4( float( ' + code + ' ) )';
- case 'i <- f' :
- case 'i <- b' : return 'int( ' + code + ' )';
- case 'i <- v2' : return 'int( ' + code + '.x )';
- case 'i <- v3' : return 'int( ' + code + '.x )';
- case 'i <- v4' : return 'int( ' + code + '.x )';
- case 'b <- f' : return '( ' + code + ' != 0.0 )';
- case 'b <- v2' : return '( ' + code + ' != vec2( 0.0 ) )';
- case 'b <- v3' : return '( ' + code + ' != vec3( 0.0 ) )';
- case 'b <- v4' : return '( ' + code + ' != vec4( 0.0 ) )';
- case 'b <- i' : return '( ' + code + ' != 0 )';
- }
- return code;
- }
-
- }
- export default NodeBuilder;
|