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