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