UNPKG

three

Version:

JavaScript 3D library

67 lines (41 loc) 1.57 kB
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;