mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
135 lines
3.3 KiB
JavaScript
135 lines
3.3 KiB
JavaScript
/**
|
|
* Automatic node cache
|
|
* @author sunag / http://www.sunag.com.br/
|
|
*/
|
|
|
|
THREE.TempNode = function ( type, params ) {
|
|
|
|
THREE.GLNode.call( this, type );
|
|
|
|
params = params || {};
|
|
|
|
this.shared = params.shared !== undefined ? params.shared : true;
|
|
this.unique = params.unique !== undefined ? params.unique : false;
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype = Object.create( THREE.GLNode.prototype );
|
|
THREE.TempNode.prototype.constructor = THREE.TempNode;
|
|
|
|
THREE.TempNode.prototype.build = function ( builder, output, uuid, ns ) {
|
|
|
|
output = output || this.getType( builder );
|
|
|
|
var material = builder.material;
|
|
|
|
if ( this.isShared( builder, output ) ) {
|
|
|
|
var isUnique = this.isUnique( builder, output );
|
|
|
|
if ( isUnique && this.constructor.uuid === undefined ) {
|
|
|
|
this.constructor.uuid = THREE.Math.generateUUID();
|
|
|
|
}
|
|
|
|
uuid = builder.getUuid( uuid || this.getUuid(), ! isUnique );
|
|
|
|
var data = material.getDataNode( uuid );
|
|
|
|
if ( builder.parsing ) {
|
|
|
|
if ( data.deps || 0 > 0 ) {
|
|
|
|
this.appendDepsNode( builder, data, output );
|
|
|
|
return this.generate( builder, type, uuid );
|
|
|
|
}
|
|
|
|
return THREE.GLNode.prototype.build.call( this, builder, output, uuid );
|
|
|
|
} else if ( isUnique ) {
|
|
|
|
data.name = data.name || THREE.GLNode.prototype.build.call( this, builder, output, uuid );
|
|
|
|
return data.name;
|
|
|
|
} else if ( ! builder.optimize || data.deps == 1 ) {
|
|
|
|
return THREE.GLNode.prototype.build.call( this, builder, output, uuid );
|
|
|
|
}
|
|
|
|
uuid = this.getUuid( false );
|
|
|
|
var name = this.getTemp( builder, uuid );
|
|
var type = data.output || this.getType( builder );
|
|
|
|
if ( name ) {
|
|
|
|
return builder.format( name, type, output );
|
|
|
|
} else {
|
|
|
|
name = THREE.TempNode.prototype.generate.call( this, builder, output, uuid, data.output, ns );
|
|
|
|
var code = this.generate( builder, type, uuid );
|
|
|
|
if ( builder.isShader( 'vertex' ) ) material.addVertexNode( name + '=' + code + ';' );
|
|
else material.addFragmentNode( name + '=' + code + ';' );
|
|
|
|
return builder.format( name, type, output );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return THREE.GLNode.prototype.build.call( this, builder, output, uuid );
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype.isShared = function ( builder, output ) {
|
|
|
|
return output !== 'sampler2D' && output !== 'samplerCube' && this.shared;
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype.isUnique = function ( builder, output ) {
|
|
|
|
return this.unique;
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype.getUuid = function ( unique ) {
|
|
|
|
var uuid = unique || unique == undefined ? this.constructor.uuid || this.uuid : this.uuid;
|
|
|
|
if ( typeof this.scope == "string" ) uuid = this.scope + '-' + uuid;
|
|
|
|
return uuid;
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype.getTemp = function ( builder, uuid ) {
|
|
|
|
uuid = uuid || this.uuid;
|
|
|
|
var material = builder.material;
|
|
|
|
if ( builder.isShader( 'vertex' ) && material.vertexTemps[ uuid ] ) return material.vertexTemps[ uuid ].name;
|
|
else if ( material.fragmentTemps[ uuid ] ) return material.fragmentTemps[ uuid ].name;
|
|
|
|
};
|
|
|
|
THREE.TempNode.prototype.generate = function ( builder, output, uuid, type, ns ) {
|
|
|
|
if ( ! this.isShared( builder, output ) ) console.error( "THREE.TempNode is not shared!" );
|
|
|
|
uuid = uuid || this.uuid;
|
|
|
|
if ( builder.isShader( 'vertex' ) ) return builder.material.getVertexTemp( uuid, type || this.getType( builder ), ns ).name;
|
|
else return builder.material.getFragmentTemp( uuid, type || this.getType( builder ), ns ).name;
|
|
|
|
};
|