three
Version:
JavaScript 3D library
67 lines (41 loc) • 1.57 kB
JavaScript
import AnalyticLightNode from './AnalyticLightNode.js';
import LightsNode from './LightsNode.js';
import getDistanceAttenuation from '../functions/light/getDistanceAttenuation.js';
import { uniform, positionView, objectViewPosition } from '../shadernode/ShaderNodeElements.js';
import { PointLight } from 'three';
class PointLightNode extends AnalyticLightNode {
constructor( light = null ) {
super( light );
this.cutoffDistanceNode = uniform( 0 );
this.decayExponentNode = uniform( 0 );
}
update( frame ) {
const { light } = this;
super.update( frame );
this.cutoffDistanceNode.value = light.distance;
this.decayExponentNode.value = light.decay;
}
construct( builder ) {
const { colorNode, cutoffDistanceNode, decayExponentNode, light } = this;
const lVector = objectViewPosition( light ).sub( positionView );
const lightDirection = lVector.normalize();
const lightDistance = lVector.length();
const lightAttenuation = getDistanceAttenuation.call( {
lightDistance,
cutoffDistance: cutoffDistanceNode,
decayExponent: decayExponentNode
} );
const lightColor = colorNode.mul( lightAttenuation );
const lightingModelFunctionNode = builder.context.lightingModelNode;
const reflectedLight = builder.context.reflectedLight;
if ( lightingModelFunctionNode && lightingModelFunctionNode.direct ) {
lightingModelFunctionNode.direct.call( {
lightDirection,
lightColor,
reflectedLight
}, builder );
}
}
}
LightsNode.setReference( PointLight, PointLightNode );
export default PointLightNode;