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; |