50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { Return, VariableDeclaration, Accessor } from './AST.js';
 | 
						|
import GLSLDecoder from './GLSLDecoder.js';
 | 
						|
 | 
						|
class ShaderToyDecoder extends GLSLDecoder {
 | 
						|
 | 
						|
	constructor() {
 | 
						|
 | 
						|
		super();
 | 
						|
 | 
						|
		this.addPolyfill( 'iTime', 'float iTime = timerGlobal();' );
 | 
						|
		this.addPolyfill( 'iResolution', 'vec2 iResolution = viewportResolution;' );
 | 
						|
		this.addPolyfill( 'fragCoord', 'vec3 fragCoord = vec3( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y, viewportCoordinate.z );' );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	parseFunction() {
 | 
						|
 | 
						|
		const node = super.parseFunction();
 | 
						|
 | 
						|
		if ( node.name === 'mainImage' ) {
 | 
						|
 | 
						|
			node.params = []; // remove default parameters
 | 
						|
			node.type = 'vec4';
 | 
						|
			node.layout = false; // for now
 | 
						|
 | 
						|
			const fragColor = new Accessor( 'fragColor' );
 | 
						|
 | 
						|
			for ( const subNode of node.body ) {
 | 
						|
 | 
						|
				if ( subNode.isReturn ) {
 | 
						|
 | 
						|
					subNode.value = fragColor;
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			node.body.unshift( new VariableDeclaration( 'vec4', 'fragColor' ) );
 | 
						|
			node.body.push( new Return( fragColor ) );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return node;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export default ShaderToyDecoder;
 |