You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.1 KiB
79 lines
2.1 KiB
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;
|
|
|