67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import ContextNode from '../core/ContextNode.js'; | ||
|  | import { addNodeClass } from '../core/Node.js'; | ||
|  | import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js'; | ||
|  | 
 | ||
|  | class LightingContextNode extends ContextNode { | ||
|  | 
 | ||
|  | 	constructor( node, lightingModel = null, backdropNode = null, backdropAlphaNode = null ) { | ||
|  | 
 | ||
|  | 		super( node ); | ||
|  | 
 | ||
|  | 		this.lightingModel = lightingModel; | ||
|  | 		this.backdropNode = backdropNode; | ||
|  | 		this.backdropAlphaNode = backdropAlphaNode; | ||
|  | 
 | ||
|  | 		this._context = null; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	getContext() { | ||
|  | 
 | ||
|  | 		const { backdropNode, backdropAlphaNode } = this; | ||
|  | 
 | ||
|  | 		const directDiffuse = vec3().temp( 'directDiffuse' ), | ||
|  | 			directSpecular = vec3().temp( 'directSpecular' ), | ||
|  | 			indirectDiffuse = vec3().temp( 'indirectDiffuse' ), | ||
|  | 			indirectSpecular = vec3().temp( 'indirectSpecular' ); | ||
|  | 
 | ||
|  | 		const reflectedLight = { | ||
|  | 			directDiffuse, | ||
|  | 			directSpecular, | ||
|  | 			indirectDiffuse, | ||
|  | 			indirectSpecular | ||
|  | 		}; | ||
|  | 
 | ||
|  | 		const context = { | ||
|  | 			radiance: vec3().temp( 'radiance' ), | ||
|  | 			irradiance: vec3().temp( 'irradiance' ), | ||
|  | 			iblIrradiance: vec3().temp( 'iblIrradiance' ), | ||
|  | 			ambientOcclusion: float( 1 ).temp( 'ambientOcclusion' ), | ||
|  | 			reflectedLight, | ||
|  | 			backdrop: backdropNode, | ||
|  | 			backdropAlpha: backdropAlphaNode | ||
|  | 		}; | ||
|  | 
 | ||
|  | 		return context; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	setup( builder ) { | ||
|  | 
 | ||
|  | 		this.context = this._context || ( this._context = this.getContext() ); | ||
|  | 		this.context.lightingModel = this.lightingModel || builder.context.lightingModel; | ||
|  | 
 | ||
|  | 		return super.setup( builder ); | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | export default LightingContextNode; | ||
|  | 
 | ||
|  | export const lightingContext = nodeProxy( LightingContextNode ); | ||
|  | 
 | ||
|  | addNodeElement( 'lightingContext', lightingContext ); | ||
|  | 
 | ||
|  | addNodeClass( 'LightingContextNode', LightingContextNode ); |