diff --git a/src/nodes/functions/BasicLightingModel.js b/src/nodes/functions/BasicLightingModel.js index 2d2f792392d599..941f5ed708c967 100644 --- a/src/nodes/functions/BasicLightingModel.js +++ b/src/nodes/functions/BasicLightingModel.js @@ -3,6 +3,7 @@ import { diffuseColor } from '../core/PropertyNode.js'; import { MultiplyOperation, MixOperation, AddOperation } from '../../constants.js'; import { materialSpecularStrength, materialReflectivity } from '../accessors/MaterialNode.js'; import { mix } from '../math/MathNode.js'; +import { vec4 } from '../shadernode/ShaderNode.js'; class BasicLightingModel extends LightingModel { @@ -12,12 +13,32 @@ class BasicLightingModel extends LightingModel { } - indirect( { ambientOcclusion, reflectedLight } ) { + indirect( context, stack, builder ) { - reflectedLight.indirectDiffuse.addAssign( diffuseColor.rgb ); + const ambientOcclusion = context.ambientOcclusion; + const reflectedLight = context.reflectedLight; + const irradianceLightMap = builder.context.irradianceLightMap; + + reflectedLight.indirectDiffuse.assign( vec4( 0.0 ) ); + + // accumulation (baked indirect lighting only) + + if ( irradianceLightMap ) { + + reflectedLight.indirectDiffuse.addAssign( irradianceLightMap ); + + } else { + + reflectedLight.indirectDiffuse.addAssign( vec4( 1.0, 1.0, 1.0, 0.0 ) ); + + } + + // modulation reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion ); + reflectedLight.indirectDiffuse.mulAssign( diffuseColor.rgb ); + } finish( context, stack, builder ) { diff --git a/src/nodes/lighting/BasicLightMapNode.js b/src/nodes/lighting/BasicLightMapNode.js new file mode 100644 index 00000000000000..d03f06e635d919 --- /dev/null +++ b/src/nodes/lighting/BasicLightMapNode.js @@ -0,0 +1,29 @@ +import LightingNode from './LightingNode.js'; +import { addNodeClass } from '../core/Node.js'; +import { float } from '../shadernode/ShaderNode.js'; + +class BasicLightMapNode extends LightingNode { + + constructor( lightMapNode = null ) { + + super(); + + this.lightMapNode = lightMapNode; + + } + + setup( builder ) { + + // irradianceLightMap property is used in the indirectDiffuse() method of BasicLightingModel + + const RECIPROCAL_PI = float( 1 / Math.PI ); + + builder.context.irradianceLightMap = this.lightMapNode.mul( RECIPROCAL_PI ); + + } + +} + +export default BasicLightMapNode; + +addNodeClass( 'BasicLightMapNode', BasicLightMapNode ); diff --git a/src/nodes/materials/MeshBasicNodeMaterial.js b/src/nodes/materials/MeshBasicNodeMaterial.js index 82f16a3ba95e84..a1eb80f838b92b 100644 --- a/src/nodes/materials/MeshBasicNodeMaterial.js +++ b/src/nodes/materials/MeshBasicNodeMaterial.js @@ -1,6 +1,8 @@ import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js'; +import { materialLightMap } from '../accessors/MaterialNode.js'; import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js'; import BasicEnvironmentNode from '../lighting/BasicEnvironmentNode.js'; +import BasicLightMapNode from '../lighting/BasicLightMapNode.js'; import BasicLightingModel from '../functions/BasicLightingModel.js'; const defaultValues = new MeshBasicMaterial(); @@ -30,6 +32,20 @@ class MeshBasicNodeMaterial extends NodeMaterial { } + setupLightMap( builder ) { + + let node = null; + + if ( builder.material.lightMap ) { + + node = new BasicLightMapNode( materialLightMap ); + + } + + return node; + + } + setupLightingModel() { return new BasicLightingModel(); diff --git a/src/nodes/materials/NodeMaterial.js b/src/nodes/materials/NodeMaterial.js index 26c256c43d8fea..fb961107461c30 100644 --- a/src/nodes/materials/NodeMaterial.js +++ b/src/nodes/materials/NodeMaterial.js @@ -351,6 +351,20 @@ class NodeMaterial extends Material { } + setupLightMap( builder ) { + + let node = null; + + if ( builder.material.lightMap ) { + + node = new IrradianceNode( materialLightMap ); + + } + + return node; + + } + setupLights( builder ) { const materialLightsNode = []; @@ -365,9 +379,11 @@ class NodeMaterial extends Material { } - if ( builder.material.lightMap ) { + const lightMapNode = this.setupLightMap( builder ); + + if ( lightMapNode && lightMapNode.isLightingNode ) { - materialLightsNode.push( new IrradianceNode( materialLightMap ) ); + materialLightsNode.push( lightMapNode ); }