UNPKG

three

Version:

JavaScript 3D library

127 lines (69 loc) 2.22 kB
import LightingNode from './LightingNode.js'; import { NodeUpdateType } from '../core/constants.js'; import { uniform } from '../core/UniformNode.js'; import { Color } from '../../math/Color.js'; import { renderGroup } from '../core/UniformGroupNode.js'; import { hash } from '../core/NodeUtils.js'; import { shadow } from './ShadowNode.js'; import { nodeObject } from '../tsl/TSLCore.js'; class AnalyticLightNode extends LightingNode { static get type() { return 'AnalyticLightNode'; } constructor( light = null ) { super(); this.light = light; this.color = new Color(); this.colorNode = ( light && light.colorNode ) || uniform( this.color ).setGroup( renderGroup ); this.baseColorNode = null; this.shadowNode = null; this.shadowColorNode = null; this.isAnalyticLightNode = true; this.updateType = NodeUpdateType.FRAME; } getCacheKey() { return hash( super.getCacheKey(), this.light.id, this.light.castShadow ? 1 : 0 ); } getHash() { return this.light.uuid; } setupShadowNode() { return shadow( this.light ); } setupShadow( builder ) { const { renderer } = builder; if ( renderer.shadowMap.enabled === false ) return; let shadowColorNode = this.shadowColorNode; if ( shadowColorNode === null ) { const customShadowNode = this.light.shadow.shadowNode; let shadowNode; if ( customShadowNode !== undefined ) { shadowNode = nodeObject( customShadowNode ); } else { shadowNode = this.setupShadowNode( builder ); } this.shadowNode = shadowNode; this.shadowColorNode = shadowColorNode = this.colorNode.mul( shadowNode ); this.baseColorNode = this.colorNode; } // this.colorNode = shadowColorNode; } setup( builder ) { this.colorNode = this.baseColorNode || this.colorNode; if ( this.light.castShadow ) { if ( builder.object.receiveShadow ) { this.setupShadow( builder ); } } else if ( this.shadowNode !== null ) { this.shadowNode.dispose(); this.shadowNode = null; this.shadowColorNode = null; } } update( /*frame*/ ) { const { light } = this; this.color.copy( light.color ).multiplyScalar( light.intensity ); } } export default AnalyticLightNode;