| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | import Node from '../core/Node.js';import Object3DNode from '../accessors/Object3DNode.js';import PositionNode from '../accessors/PositionNode.js';import ColorNode from '../inputs/ColorNode.js';import FloatNode from '../inputs/FloatNode.js';import OperatorNode from '../math/OperatorNode.js';import MathNode from '../math/MathNode.js';import { NodeUpdateType } from '../core/constants.js';import { getDistanceAttenuation } from '../functions/BSDFs.js';import { Color } from 'three';class LightNode extends Node {	constructor( light = null ) {		super( 'vec3' );		this.updateType = NodeUpdateType.Object;		this.light = light;		this.colorNode = new ColorNode( new Color() );		this.lightCutoffDistanceNode = new FloatNode( 0 );		this.lightDecayExponentNode = new FloatNode( 0 );	}	update( /* frame */ ) {		this.colorNode.value.copy( this.light.color ).multiplyScalar( this.light.intensity );		this.lightCutoffDistanceNode.value = this.light.distance;		this.lightDecayExponentNode.value = this.light.decay;	}	generate( builder ) {		const lightPositionView = new Object3DNode( Object3DNode.VIEW_POSITION );		const positionView = new PositionNode( PositionNode.VIEW );		const lVector = new OperatorNode( '-', lightPositionView, positionView );		const lightDirection = new MathNode( MathNode.NORMALIZE, lVector );		const lightDistance = new MathNode( MathNode.LENGTH, lVector );		const lightAttenuation = getDistanceAttenuation( {			lightDistance,			cutoffDistance: this.lightCutoffDistanceNode,			decayExponent: this.lightDecayExponentNode		} );		const lightColor = new OperatorNode( '*', this.colorNode, lightAttenuation );		lightPositionView.object3d = this.light;		const lightingModelFunction = builder.context.lightingModel;		if ( lightingModelFunction !== undefined ) {			const directDiffuse = builder.context.directDiffuse;			const directSpecular = builder.context.directSpecular;			lightingModelFunction( {				lightDirection,				lightColor,				directDiffuse,				directSpecular			}, builder );		}	}}export default LightNode;
 |