three
Version:
JavaScript 3D library
100 lines (54 loc) • 2.11 kB
JavaScript
/**
* @author sunag / http://www.sunag.com.br/
*/
THREE.GLNode = function( type ) {
this.uuid = THREE.Math.generateUUID();
this.allow = {};
this.requestUpdate = false;
this.type = type;
};
THREE.GLNode.prototype.parse = function( builder, cache, requires ) {
builder.parsing = true;
var material = builder.material;
this.build( builder.addCache( cache, requires ), 'v4' );
material.clearVertexNode();
material.clearFragmentNode();
builder.removeCache();
builder.parsing = false;
};
THREE.GLNode.prototype.parseAndBuildCode = function( builder, output, cache, requires ) {
this.parse( builder, cache, requires );
return this.buildCode( builder, output, cache, requires );
};
THREE.GLNode.prototype.buildCode = function( builder, output, cache, requires ) {
var material = builder.material;
var data = { result : this.build( builder.addCache( cache, requires ), output ) };
if ( builder.isShader( 'vertex' ) ) data.code = material.clearVertexNode();
else data.code = material.clearFragmentNode();
builder.removeCache();
return data;
};
THREE.GLNode.prototype.build = function( builder, output, uuid ) {
var material = builder.material;
var data = material.getDataNode( uuid || this.uuid );
if ( builder.parsing ) this.appendDepsNode( builder, data, output );
if ( this.allow[ builder.shader ] === false ) {
throw new Error( 'Shader ' + shader + ' is not compatible with this node.' );
}
if ( this.requestUpdate && ! data.requestUpdate ) {
material.requestUpdate.push( this );
data.requestUpdate = true;
}
return this.generate( builder, output, uuid );
};
THREE.GLNode.prototype.appendDepsNode = function( builder, data, output ) {
data.deps = ( data.deps || 0 ) + 1;
var outputLen = builder.getFormatLength( output );
if ( outputLen > ( data.outputMax || 0 ) || this.getType( builder ) ) {
data.outputMax = outputLen;
data.output = output;
}
};
THREE.GLNode.prototype.getType = function( builder ) {
return this.type;
};